【问题标题】:Call oracle stored procedure with cursor output parameter from python script使用 python 脚本中的游标输出参数调用 oracle 存储过程
【发布时间】:2013-09-30 13:36:34
【问题描述】:

我正在尝试从 python 脚本调用带有 2 in 和 1 out 参数的 oracle 存储过程。我遇到的问题是传递一个游标输出参数。

Oracle 存储过程本质上是:

  PROCEDURE ci_lac_state 
     (LAC_ID_IN IN  VARCHAR2,  
      CI_ID_IN  IN  VARCHAR2 DEFAULT NULL,
      CGI_ID    OUT SYS_REFCURSOR)
  AS
  BEGIN
      OPEN cgi_id FOR
      ...
  END;

调用数据库的python代码是:

  #! /usr/bin/python

  import cx_Oracle

  lac='11508'
  ci='9312'

  try:
      my_connection=cx_Oracle.Connection('login/passwd@db_name')
  except cx_Oracle.DatabaseError,info:
      print "Logon Error:",info
      sys.exit()

  my_cursor=my_connection.cursor()
  cur_var=my_cursor.var(cx_Oracle.CURSOR)

  my_cursor.callproc("cgi_info.ci_lac_state", [lac, ci, cur_var])

  print cur_var.getvalue()

我得到这样的光标值作为结果:

  <__builtin__.OracleCursor on <cx_Oracle.Connection to login@db_name>>

我做错了什么?

谢谢。

【问题讨论】:

  • 你试过print cur_var.getvalue(pos=0) 吗?或者如果您需要检索 CGI_ID 的 cur_var 则可能是 pos=2
  • 致 FoxMaSk。是的。我试过这样做“print cur_var.getvalue(pos=0)”,但我得到了相同的结果“>”上的<__builtin__.oraclecursor print cur_var.getvalue indexerror: variable_getsinglevalue: array size exceeded>
  • 致 ThinkJet。不幸的是,我的问题与发布“Python-Oracle Passing in a Cursor Out Parameter”不同

标签: python oracle stored-procedures cursor cx-oracle


【解决方案1】:

我刚刚遇到了类似的问题。 cur_var 具有 &lt;type 'cx_Oracle.CURSOR'&gt; 类型,cur_var.getvalue() 获取 &lt;type 'OracleCursor'&gt; 类型的对象。要获取数据,您必须从 OracleCursor 对象中获取它们。举个例子:

print cur_var.getvalue().fetchall()

要查看 OracleCursor 对象的更多功能,只需检查其目录:

dir(cur_var.getvalue())

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    你可以定义你的输出,然后使用这样的隐式游标循环:

    outVal = cursor.var(cx_Oracle.CURSOR)
    

    something = cursor.callproc(&lt;your procedure name&gt;, [outVal,&lt;input variable here&gt;])

    for implicitCursor in cursor.getimplicitresults():
        for row in implicitCursor:
            
            fout.write(''.join(row)) # note: tuple conversion inside ()
            fout.write('\n')
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2017-07-19
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2012-11-24
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多