Как запустить команды sql без запроса с помощью cx_Oracle?

Я пытаюсь запустить эти команды с помощью 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: не запрос

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

Редактировать:

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

            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

Кроме того, как мне это сделать?


person Di Zou    schedule 23.01.2012    source источник


Ответы (1)


Лучший способ - вызвать процедуру напрямую, используя _1 _.

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)
person Ben    schedule 23.01.2012
comment
Thasnk !. Я внес некоторые изменения в свой код, но теперь получаю новую ошибку. Вы можете взглянуть? - person Di Zou; 24.01.2012
comment
Похоже, это может быть проблема с самой процедурой Oracle, поскольку я ожидал, что TypeError будет поднят с помощью python, но вы неправильно передаете некоторые переменные, например, 'null' должно быть просто None. - person Ben; 24.01.2012
comment
как мне передать дату? Когда я пытаюсь передать его как 'sysdate + 7', я получаю сообщение об ошибке. Когда я пытаюсь передать его как datetime.now() + timedelta(seconds=10), мое приложение блокируется. - person Di Zou; 24.01.2012