3

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

4

4 回答 4

4

您可以使用 检索 dbms_output DBMS_OUTPUT.GET_LINE(buffer, status)。成功时状态为 0,没有更多数据时状态为 1。

您也可以使用get_lines(lines, numlines). numlines是输入输出。您将其设置为最大行数,并将其设置为输出的实际数量。您可以在循环中调用它并在返回numlines小于您的输入时退出。lines是一个输出数组。

于 2011-03-09T15:08:55.060 回答
0

无论你使用 using put_line,你都会阅读 using get_line; 我相信这就是所有这些工具的工作方式,可能包括 SQL*Plus。

请注意,您需要调用get_line足够多的时间来耗尽缓冲区。如果你不这样做,未读的部分将被下一个覆盖put_line

于 2011-03-09T14:56:35.993 回答
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)
于 2020-11-04T12:10:58.380 回答
-1

你试过这个吗?

>>> conn = cx_Oracle.connect('user/pw@SCHEMA')
>>> cursor = conn.cursor()
>>> output = cursor.callproc("dbms_output.put_line", ['foo',])
>>> output
['foo']

第一个参数是要调用的过程,第二个参数是参数序列或绑定变量的字典。

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

于 2011-03-09T12:22:36.557 回答