cx_Oracle中有没有办法从oracle存储过程中捕获stdout输出?这些在使用Oracle的SQL Developer或SQL Plus时出现,但似乎没有办法使用数据库驱动程序获取它。
答案 0 :(得分:4)
您可以使用DBMS_OUTPUT.GET_LINE(buffer, status)
检索dbms_output。成功时状态为0,没有更多数据时状态为1.
您也可以使用get_lines(lines, numlines)
。 numlines
是输入输出。您将其设置为最大行数,并将其设置为输出时的实际数字。您可以在循环中调用它,并在返回的numlines
小于您的输入时退出。 lines
是一个输出数组。
答案 1 :(得分:0)
无论您使用put_line
投放什么,都可以使用get_line
阅读;我相信这就是所有这些工具的工作方式,可能包括SQL * Plus。
请注意,您需要调用get_line
足够的时间来耗尽缓冲区。如果不这样做,未读部分将被下一个put_line
覆盖。
答案 2 :(得分:0)
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)
答案 3 :(得分:-1)
你试过这个吗?
>>> conn = cx_Oracle.connect('user/pw@SCHEMA')
>>> cursor = conn.cursor()
>>> output = cursor.callproc("dbms_output.put_line", ['foo',])
>>> output
['foo']
第一个参数是调用的过程,第二个参数是一个参数序列或者是bindvars的dict。