【问题标题】:How do I run non query sql commands using cx_Oracle?如何使用 cx_Oracle 运行非查询 sql 命令?
【发布时间】:2012-01-23 22:02:42
【问题描述】:

我正在尝试使用 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 行

另外,我该如何提交?

【问题讨论】:

    标签: python sql cx-oracle


    【解决方案1】:

    最好的方法是直接使用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)
    

    【讨论】:

    • 谢谢!。我对我的代码进行了一些更改,但我现在遇到了一个新错误。可以看看吗?
    • 看起来这可能是Oracle过程本身的问题,因为我希望python会引发TypeError,但是您错误地传递了一些变量,例如'null'应该只是是None
    • 我应该如何传递日期?当我尝试将其作为'sysdate + 7' 传递时,出现错误。当我尝试将其作为datetime.now() + timedelta(seconds=10) 传递时,我的应用程序锁定了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2015-04-08
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多