使用cx_Oracle捕获存储过程的标准输出
在使用cx_Oracle的时候,有没有办法获取Oracle存储过程的标准输出(stdout)呢?在使用Oracle的SQL Developer或者SQL Plus时,这些输出是可以看到的,但通过数据库驱动似乎没有办法把它们提取出来。
5 个回答
0
你用 put_line
放进去的东西,都是用 get_line
来读取的;我觉得所有这些工具都是这样工作的,可能连 SQL*Plus 也是。
要注意,你需要多次调用 get_line
,直到把缓冲区里的内容读完。如果不这样做,没读的部分会被下一个 put_line
放进去的内容覆盖掉。
1
这是一个基于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)
4
你可以通过 DBMS_OUTPUT.GET_LINE(buffer, status)
来获取 dbms_output 的内容。这里的状态(status)表示成功与否,0 表示成功,1 表示没有更多数据了。
你还可以使用 get_lines(lines, numlines)
。这里的 numlines
是一个输入输出参数。你先把它设置为你想要的最大行数,然后在输出时,它会被设置为实际获取到的行数。你可以在一个循环中调用这个方法,当返回的 numlines
小于你输入的值时,就可以退出循环了。lines
是一个输出数组,用来存放获取到的内容。