使用cx_Oracle从存储过程捕获stdout输出

时间:2011-03-09 10:36:47

标签: python oracle10g cx-oracle

cx_Oracle中有没有办法从oracle存储过程中捕获stdout输出?这些在使用Oracle的SQL Developer或SQL Plus时出现,但似乎没有办法使用数据库驱动程序获取它。

4 个答案:

答案 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。

另见: http://cx-oracle.sourceforge.net/html/cursor.html