2012-01-23 1 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

Как я могу запустить эти команды sql, которые не являются запросами, используя cx_oracle?

Edit:

После внесения изменений это то, что я сейчас:

  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, так как я бы ожидал, что 'TypeError' будет поднят на python, но вы неправильно переносите некоторые переменные, например' 'null'' должно быть просто' None'. – Ben

+0

Как я могу передать дату? Когда я пытаюсь передать его как '' sysdate + 7'', я получаю сообщение об ошибке. Когда я пытаюсь передать его как 'datetime.now() + timedelta (seconds = 10)' мое приложение блокируется. –

Смежные вопросы