3

cx_Oracle で、Oracle ストアド プロシージャから stdout 出力を取得する方法はありますか? これらは、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

を使用して何を入れても、を使用put_lineして読み取り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']

最初の引数は呼び出すプロシージャで、2 番目の引数は一連の引数または bindvars の辞書です。

参照: http://cx-oracle.sourceforge.net/html/cursor.html

于 2011-03-09T12:22:36.557 に答える