2

cx_oracle を使用してこれらのコマンドを実行しようとしています。

begin
add_command_pkg.add_command
(  command_id    => 7,
   expiry_time   => sysdate + 7
 );

add_command_pkg.add_command
(  command_id    => 12,
   expiry_time   => sysdate + 7
 );
commit;
end;

だから、これは私のPythonコードです:

dsn = cx_Oracle.makedsn(hostname, port, sid)
orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)

curs = orcl.cursor()
cmd = "begin \n\
       add_command_pkg.add_command \n\
       (  command_id    => 7, \n\
          expiry_time   => sysdate + 7 \n\
       ); \n\
       \n\
       add_command_pkg.add_command \n\
       (  command_id    => 12, \n\
          expiry_time   => sysdate + 7 \n\
       ); \n\
       commit; \n\
       end;"

curs.execute(cmd)
orcl.close()

このコードを実行すると、次のエラーが発生します。

cx_Oracle.InterfaceError: クエリではありません

では、cx_oracle を使用してクエリではないこれらの SQL コマンドを実行するにはどうすればよいでしょうか。

編集:

変更を加えた後、これは私が今持っているものです:

            curs.callproc('add_command_pkg.add_command', [],
                          { 'command_id' : 7,
                            'session_id' : 'null',
                            'p_expiry_time' : 'sysdate + 7',
                            'config_id' : 6 })

これを実行すると、次のエラーが発生します。

ファイル "N:\App\MainWidget.py"、456 行目、myFunc
'config_id' : 6 })
cx_Oracle.DatabaseError: ORA-01858: 数値が必要な場所に非数値文字が見つかりました
ORA-06512: 行1

また、これをコミットするにはどうすればよいですか?

4

1 に答える 1

7

最善の方法は、 を使用してプロシージャを直接呼び出すことcallprocです。

curs.callproc['add_command_pkg.add_command',['7', 'sysdate + 7']]
orcl.commit()

または、キーワード引数を使用する必要がある場合は、リストではなく辞書を直接使用してください。

curs.callproc['add_command_pkg.add_command'
             , {'command_id' : '7', 'expiry_time' : 'sysdate + 7'}]
orcl.commit()

実際の構文は

curs.callproc['package_name.procedure_name'
             , ['list_argument1', 'list_argument2']
             , {'keyword_argument1' : 'keyword1'}
             ]

これは、Oracleの次と同じです

begin
    package_name.procedure_name( 'list_argument1', 'list_argument2'
                               , keywork_argument1 => 'keyword1');
end;

私はメソッドについてですconnectが、連結を必要とせずに次の方法で呼び出すことができます:

 cx_Oracle.connect(username, password, dsn)
于 2012-01-23T22:25:06.563 に答える