【问题标题】:Capturing stdout output from stored procedures with cx_Oracle使用 cx_Oracle 从存储过程中捕获标准输出输出
【发布时间】:2011-07-11 19:10:45
【问题描述】:

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

【问题讨论】:

    标签: python oracle10g cx-oracle


    【解决方案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

    【讨论】:

    • 这是它返回给您的输入参数,而不是 dbms_output.put_line 的结果。
    【解决方案2】:

    无论您使用put_line 输入什么,您都使用get_line 读取;我相信这就是所有这些工具的工作方式,可能包括 SQL*Plus。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-17
          • 2017-07-09
          • 1970-01-01
          • 2018-05-15
          • 1970-01-01
          • 2011-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多