使用 cx_oracle 在 Python 2.7 上执行具有多个查询的 SQL 文件

Executing SQL files with multiple queries on Python 2.7 using cx_oracle

我在通过 cx_oracle 处理一些 .sql 文件时遇到了真正的问题 运行。例如 test_table2.sql 下面 运行 如果我 运行 通过 Oracle Developer 就完美了。

declare
c int;
begin
select count(*) into c from user_tables where table_name = upper('TEST2');
if c = 1 then
  execute immediate 'drop table TEST2';
end if;

EXECUTE IMMEDIATE 'CREATE TABLE MURRAYLR.test2 as 
select * from Dans_Table';

EXECUTE IMMEDIATE'CREATE TABLE MURRAYLR.test1
( customer_id number(10) NOT NULL,
customer_name varchar2(50) NOT NULL,
city varchar2(50)
)';

end;

Python 代码通常适用于简单的查询,但是当我尝试检查现有表脚本时,它会给我错误。见下文

Python 2.7.11 代码

import sys
import cx_Oracle

connection = cx_Oracle.connect('user','password','serv')
cursor = connection.cursor()

filename="C:\Users\desktop\Test_table2.sql"

f = open(filename)
full_sql = f.read()
sql_commands = full_sql.replace('\n', '').split(';')[:-1]

for sql_command in sql_commands:
cursor.execute(sql_command)

connection.close()

错误信息

cursor.execute(sql_command) 数据库错误:ORA-06550:第 1 行,第 15 列: PLS-00103:在期望以下之一时遇到符号 "end-of-file":

:=。 ( @ % ; 非空范围默认字符

我没有尝试 运行 你的代码(因为缺少 Python 安装 cxOracle),但看起来你正在将你的匿名 PL/SQL 块分成多个单独的语句:

sql_commands = full_sql.replace('\n', '').split(';')[:-1]

因此,您尝试执行的第一个 SQL 命令是

declare
  c int;

这没有任何意义。由于您已经将所有命令放在一个匿名 PL/SQL 块中,因此您根本不需要将其拆分 - 只需 运行 整个块作为一个命令,您应该没问题。

更新

完整的解决方案(未经测试):

import sys
import cx_Oracle

connection = cx_Oracle.connect('user','password','serv')
cursor = connection.cursor()

filename="C:\Users\desktop\Test_table2.sql"

f = open(filename)
full_sql = f.read()
cursor.execute(full_sql)

connection.close()