2012-01-23 39 views
2

我試圖用cx_oracle運行這些命令:如何使用cx_Oracle運行非查詢sql命令?

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

實際的語法是

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) 
+0

Thasnk !.我對代碼做了一些更改,但是現在我得到一個新的錯誤。你可以看一下嗎? –

+0

看起來它可能是Oracle過程本身的問題,因爲我期望python會引發一個TypeError,但是你錯誤地傳遞了一些變量,例如'null''應該是'None'。 – Ben

+0

我應該如何通過日期?當我嘗試以「sysdate + 7」傳遞它時,出現錯誤。當我嘗試以'datetime.now()+ timedelta(秒= 10)'的形式傳遞它時'我的應用程序鎖定了。 –