【问题标题】:How to execute multiple DML statements in a variable sequentially using cx_Oracle如何使用 cx_Oracle 在一个变量中按顺序执行多个 DML 语句
【发布时间】:2020-08-19 07:07:34
【问题描述】:

我有一个包含两到三个 DML 语句的变量 SCRIPT。我想在连接到我的 Oracle DB 后按顺序运行它们。我尝试了以下方法,但失败并出现以下错误

    c.execute(SCRIPT)
cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended

下面是尝试过的一段代码。

SCRIPT="""UPDATE IND_AFRO.DRIVER
   SET Emp_Id = 1000, update_user_id = 'RIBST-4059'
 WHERE Emp_Id IN (SELECT Emp_Id
                    FROM IND_AFRO.DRIVER Ddq
                   WHERE     NOT EXISTS
                                 (SELECT 1
                                    FROM IND_AFRO_AF.EMPLOYEE
                                   WHERE Emp_Id = Ddq.Emp_Id)
                         AND Functional_Area_Cd = 'DC');

UPDATE IND_AFRO.APPOINTMENTS
   SET Emp_Id = 1000, update_user_id = 'RIBST-4059'
 WHERE Emp_Id IN (SELECT Emp_Id
                    FROM IND_AFRO.APPOINTMENTS Ddq
                   WHERE NOT EXISTS
                             (SELECT 1
                                FROM IND_AFRO_AF.EMP
                               WHERE Emp_Id = Ddq.Emp_Id));

UPDATE IND_AFRO.ar_application_for_aid a
   SET a.EMP_ID = 1000
 WHERE NOT EXISTS
           (SELECT 1
              FROM IND_AFRO_AF.EMP
             WHERE emp_id = a.emp_id);"""

    conn = cx_Oracle.connect(user=r'SYSTEM', password='ssadmin', dsn=CONNECTION)
    c = conn.cursor()
    c.execute(SCRIPT)
    c.close()

【问题讨论】:

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


    【解决方案1】:

    execute() 和 executemany() 函数仅适用于一条 SQL 或 PL/SQL 语句。

    您可以将这三个语句包装在一个 PL/SQL BEGIN/END 块中,例如:

    SQL> begin
      2  insert into test values(1);
      3  update test set a = 2;
      4  end;
      5  /
    
    PL/SQL procedure successfully completed.
    

    或者,您可以将字符串拆分为单独的语句。如果语句来自文件,您可以编写一个包装器来读取文件并执行每个语句。如果您限制 SQL 语法(特别是关于行终止符),这会容易得多。例如,请参阅https://github.com/oracle/python-cx_Oracle/blob/master/samples/SampleEnv.py#L116 然而,这意味着更多次调用execute(),效率不如第一个解决方案。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2011-03-02
      • 2017-04-28
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多