如何使用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: 不是一个查询
那么,我该如何使用 cx_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 中
'config_id' : 6 })
cx_Oracle.DatabaseError: ORA-01858: 找到非数字字符,但期望的是数字
ORA-06512: 在第 1 行
另外,我该如何提交这个呢?
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)