gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:14 25 4
gpt4 key购买 nike

我在通过 cx_oracle 运行一些 .sql 文件时遇到了实际问题。例如,如果我通过 Oracle Developer 运行,下面的 test_table2.sql 可以完美运行。

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

错误信息

光标.执行(sql_command)数据库错误:ORA-06550:第 1 行,第 15 列:PLS-00103:在预期以下情况之一时遇到符号“文件结束”:

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

最佳答案

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

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

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

declare
c int;

这没有任何意义。由于您已经将所有命令放入单个匿名 PL/SQL block 中,因此您根本不需要拆分它 - 只需将整个 block 作为单个命令运行,就可以了。

更新

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

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

关于python - 使用 cx_oracle 在 Python 2.7 上执行具有多个查询的 SQL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36595303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com