使用cx_Oracle捕获存储过程的标准输出

3 投票
5 回答
3468 浏览
提问于 2025-04-16 13:20

在使用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 是一个输出数组,用来存放获取到的内容。

撰写回答