Python 如何使用cx\U Oracle运行非查询sql命令?

Python 如何使用cx\U Oracle运行非查询sql命令?,python,sql,cx-oracle,Python,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运行这些命令:

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\U 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中
“配置id”:6})
cx_Oracle.DatabaseError:ORA-01858:在需要数字的位置找到非数字字符
ORA-06512:在第1行


另外,我如何提交它?

最好的方法是使用直接调用过程

或者,如果您需要直接使用关键字参数,请使用字典而不是列表

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)

Thasnk!。我对代码做了一些更改,但现在出现了一个新错误。你能看一下吗?看起来Oracle过程本身可能有问题,因为我希望python会引发
TypeError
,但是你错误地传递了一些变量,例如
'null'
应该是
None
。我应该如何传递日期?当我试图将其作为
'sysdate+7'
传递时,我得到了一个错误。当我尝试将其作为
datetime.now()+timedelta(秒=10)传递时,
我的应用程序锁定。
 cx_Oracle.connect(username, password, dsn)