使用游标作为返回变量

Posted

技术标签:

【中文标题】使用游标作为返回变量【英文标题】:Using cursor as a return variable 【发布时间】:2018-02-13 07:54:02 【问题描述】:

我正在对我用 Python 3.6 编写的 Oracle 11g 运行查询:

# running CP_ALL_PCK.get_pr

# open conncetion
con_get_pr = cx_Oracle.connect("****", "****", "****")
pr_cursor = con_get_pr.cursor()

# set parameters
pCurs = pr_cursor.var(cx_Oracle.CURSOR)
pRetCode = pr_cursor.var(cx_Oracle.NUMBER)

# run cursor
try:
  pr_cursor.callproc('CP_ALL_PCK.get_pr',(pCurs,pRetCode))
except cx_Oracle.DatabaseError as exception:
  print ('Failed to call procedure')
  print (exception)
  exit (1)

pr_cursor.fetchall()

res = pCurs.fetchall()
for row in res:
    print(row)

pr_cursor.close()
con.close()

当我尝试使用 pCurs 光标时出现此错误:

pr_cursor.fetchall()
cx_Oracle.InterfaceError: not a query

如何使用和遍历这个光标?我在 cx_oracle 的文档中搜索了答案,但找不到任何关于迭代作为过程变量返回的游标的参考。

【问题讨论】:

你说 "this error" 但你没有告诉我们错误是什么。如果没有重要的线索,很难告诉你哪里出了问题。 删除pr_cursor.fetchall()这一行,因为错误提示它不是查询 @Plirkee,但我如何通过 pCurs 进行迭代?我做错了吗? @neoghost for pCurs 你得到了res = pCurs.fetchall() 行,而不是pr_cursor 没有什么可取的。 【参考方案1】:

我解决了!

# run cursor
try:
  res = pr_cursor.callproc('<name of procedure>',[pCurs,pRetCode])[0]
except cx_Oracle.DatabaseError as exception:
  print ('Failed to call procedure')
  print (exception)
  exit (1)

i=0
for line in res:
    i=i+1
    print (") ".format(i,line))

pr_cursor.close()
con.close()

我在末尾缺少 [0] 表示我希望返回光标。 感谢大家的帮助。

找到它here

【讨论】:

以上是关于使用游标作为返回变量的主要内容,如果未能解决你的问题,请参考以下文章

REF CURSOR 总结

如何返回游标以及添加到每一行的新变量?

oracle-游标-存储过程-函数-包

ORA-01002: 提取乱序

oracle存储过程返回游标,取值报错

从匿名块返回游标结果