如何使用 cx_Oracle 在变量中顺序执行多个 DML 语句

How to execute multiple DML statements in a variable sequentially using cx_Oracle

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

    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()

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() 多次,这不如第一个解决方案有效。