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