2012-01-23 21 views
2

cx_Oracleを使用してクエリ以外のSQLコマンドを実行するにはどうすればよいですか?私は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: not a query

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

編集:これは私が今持っているもので、変更を行った後

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

私はこれを実行すると、私はこのエラーを取得:

また

File "N:\App\MainWidget.py", line 456, in myFunc
'config_id' : 6 })
cx_Oracle.DatabaseError: ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 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() 

実際の構文は、Oracleで次のように同じである

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

ある

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

私はせずに次のように呼び出すことができますconnect方法についてですけれども連結の必要性:

cx_Oracle.connect(username, password, dsn) 
+0

Thasnk !.コードにいくつか変更を加えましたが、今は新しいエラーが発生しています。あなたは見てみることができますか? –

+0

Pythonによって 'TypeError'が発生すると予想されるので、Oracleプロシージャ自体に問題があるようですが、いくつかの変数を間違って渡しています。たとえば、' null''は 'None'にする必要があります。 – Ben

+0

どのように日付を渡す必要がありますか? '' sysdate + 7 ''として渡そうとするとエラーになります。 'datetime.now()+ timedelta(seconds = 10)'として渡すと、アプリケーションがロックアップします。 –

関連する問題