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

发布于 2024-10-21 00:54:39 字数 112 浏览 1 评论 0原文

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

Is there a way in cx_Oracle to capture the stdout output from an oracle stored procedure? These show up when using Oracle's SQL Developer or SQL Plus, but there does not seem to be a way to fetch it using the database drivers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦晓ヶ微光ヅ倾城 2024-10-28 00:54:39

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

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

You can retrieve dbms_output with DBMS_OUTPUT.GET_LINE(buffer, status). Status is 0 on success and 1 when there's no more data.

You can also use get_lines(lines, numlines). numlines is input-output. You set it to the max number of lines and it is set to the actual number on output. You can call this in a loop and exit when the returned numlines is less than your input. lines is an output array.

菊凝晚露 2024-10-28 00:54:39

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)

Herby a code example based on redcayuga's first answer:

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

Then run it after calling your stored procedure with:

    for line in dbms_lines( cursor):
        log.debug( line)
友欢 2024-10-28 00:54:39

无论您使用 put_line 放置什么,您都可以使用 get_line;我相信这就是所有这些工具的工作原理,可能包括 SQL*Plus。

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

Whatever you put using put_line, you read using get_line; I believe this is how all these tools work, probably including the very SQL*Plus.

Note that you need to call get_line enough times to exhaust the buffer. If you don't, the unread part will be overwritten by the next put_line.

樱桃奶球 2024-10-28 00:54:39

不要忘记

cursor.callproc("dbms_output.enable") 

在调用实际过程之前调用,否则缓冲区将为空。

因此,在此处的其他两个答案的基础上,一个示例是(proc_name 是您的过程 - schema.package.procedure):

def execute_proc(cursor,proc_name):
    cursor.callproc("dbms_output.enable")
    cursor.callproc(proc_name)
    for line in dbms_lines( cursor):
        print( line)

Do not forget to call

cursor.callproc("dbms_output.enable") 

before calling your actual procedure, otherwise the buffer will be empty.

So building on the other two answers here, an example would be (proc_name is your procedure - schema.package.procedure):

def execute_proc(cursor,proc_name):
    cursor.callproc("dbms_output.enable")
    cursor.callproc(proc_name)
    for line in dbms_lines( cursor):
        print( line)
情深如许 2024-10-28 00:54:39

你试过这个吗?

>>> 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

Did you tried this?

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

The first argument is the procedure to call and the second a sequence of arguments or a dict for bindvars.

see also:
http://cx-oracle.sourceforge.net/html/cursor.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文