【问题标题】:Calling oracle procedure from cx_Oracle从 cx_Oracle 调用 oracle 过程
【发布时间】:2018-08-12 19:17:54
【问题描述】:

查询,在 ide 中工作,我想执行:

begin
  sys.dbms_scheduler.create_schedule(schedule_name   => 'U6_GB.SCHED_DAILY_7_30',
                                     start_date      => to_date(null),
                                     repeat_interval => 'Freq=Daily;ByHour=7;ByMinute=30',
                                     end_date        => to_date(null),
                                     comments        => '');
end;

程序签名:

 DBMS_SCHEDULER.CREATE_SCHEDULE (
   schedule_name          IN VARCHAR2,
   start_date             IN TIMESTAMP WITH TIMEZONE DEFAULT NULL,
   repeat_interval        IN VARCHAR2,
   end_date               IN TIMESTAMP WITH TIMEZONE DEFAULT NULL,
   comments               IN VARCHAR2 DEFAULT NULL);

我试过了:

from django.db import connection
cursor = connection.cursor()
cursor.callproc('''
    begin
      sys.dbms_scheduler.create_schedule(schedule_name   => 'U6_GB.SCHED_DAILY_7_30',
                                         start_date      => to_date(null),
                                         repeat_interval => 'Freq=Daily;ByHour=7;ByMinute=30',
                                         end_date        => to_date(null),
                                         comments        => '');
    end;
''')

我得到了这个:

return self.cursor.callproc(procname)
cx_Oracle.DatabaseError: ORA-06550: line 9, column 2:
PLS-00103: Encountered the symbol ")" when expecting one of the following:

然后我尝试了:

cursor.callproc('SYS.DBMS_SCHEDULER.CREATE_SCHEDULE', (
    "U6_GB.SCHED_DAILY_7_30",
    "to_date(null)",
    "Freq=Daily;ByHour=7;ByMinute=30",
    "to_date(null)",
    "",
))

我明白了:

return self.cursor.callproc(procname, params)
cx_Oracle.DatabaseError: ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 1

我做错了什么?

Win32 上的 Python 3.6.2(v3.6.2:5fd33b5,2017 年 7 月 8 日,04:14:34)[MSC v.1900 32 位(英特尔)]

Oracle 数据库 11g 企业版 11.2.0.4.0 版

cx-Oracle==6.0.3

【问题讨论】:

    标签: python oracle python-3.x plsql cx-oracle


    【解决方案1】:

    试试这个:将你的调用字符串放在双引号内并使用execute

    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("
        begin
          sys.dbms_scheduler.create_schedule(schedule_name   => 'U6_GB.SCHED_DAILY_7_30',
                                             start_date      => to_date(null),
                                             repeat_interval => 'Freq=Daily;ByHour=7;ByMinute=30',
                                             end_date        => to_date(null),
                                             comments        => '');
        end;
    ")
    

    【讨论】:

    • 我试过在一行中执行程序(你的代码无效),结果一样
    • @Vladimir 尝试使用execute 而不是callproc。我编辑了我的答案。
    • 谢谢@Plirkee,我尝试这样做,我的错误出现在错误的注释中:“-”而不是“--”。史诗般的失败。
    【解决方案2】:

    您可以使用 callproc() 和关键字参数进行上述调用,如下所示:

    kwArgs = dict(schedule_name = 'U6_GB.SCHED_DAILY_7_30', repeat_interval = 'Freq=Daily;ByHour=7;ByMinute=30') cursor.callproc("dbms_scheduler.create_schedule", [], kwArgs)

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2011-04-25
      • 2015-05-22
      • 1970-01-01
      • 2012-01-27
      • 2013-09-28
      • 2017-05-21
      • 1970-01-01
      相关资源
      最近更新 更多