【发布时间】:2011-07-11 19:10:45
【问题描述】:
cx_Oracle 中有没有办法从 oracle 存储过程中捕获标准输出?这些在使用 Oracle 的 SQL Developer 或 SQL Plus 时会出现,但似乎没有办法使用数据库驱动程序来获取它。
【问题讨论】:
标签: python oracle10g cx-oracle
cx_Oracle 中有没有办法从 oracle 存储过程中捕获标准输出?这些在使用 Oracle 的 SQL Developer 或 SQL Plus 时会出现,但似乎没有办法使用数据库驱动程序来获取它。
【问题讨论】:
标签: python oracle10g cx-oracle
你试过了吗?
>>> conn = cx_Oracle.connect('user/pw@SCHEMA')
>>> cursor = conn.cursor()
>>> output = cursor.callproc("dbms_output.put_line", ['foo',])
>>> output
['foo']
第一个参数是要调用的过程,第二个参数是参数序列或绑定变量的字典。
【讨论】:
无论您使用put_line 输入什么,您都使用get_line 读取;我相信这就是所有这些工具的工作方式,可能包括 SQL*Plus。
请注意,您需要调用get_line 足够的次数来耗尽缓冲区。如果不这样做,未读部分将被下一个put_line 覆盖。
【讨论】:
您可以使用DBMS_OUTPUT.GET_LINE(buffer, status) 检索 dbms_output。状态为 0 表示成功,1 表示没有更多数据。
您也可以使用get_lines(lines, numlines)。 numlines 是输入输出。您将其设置为最大行数,并将其设置为输出的实际数量。当返回的numlines 小于您的输入时,您可以循环调用它并退出。 lines 是一个输出数组。
【讨论】:
Herby 基于 redcayuga 的第一个答案的代码示例:
def dbms_lines( cursor):
status = cursor.var( cx_Oracle.NUMBER)
line = cursor.var( cx_Oracle.STRING)
lines = []
while True:
cursor.callproc( 'DBMS_OUTPUT.GET_LINE', (line, status))
if status.getvalue() == 0:
lines.append( line.getvalue())
else:
break
return lines
然后在调用存储过程后运行它:
for line in dbms_lines( cursor):
log.debug( line)
【讨论】: