gpt4 book ai didi

python - 如何使用 cx_oracle 执行 SQL 脚本

转载 作者:行者123 更新时间:2023-12-05 03:58:30 25 4
gpt4 key购买 nike

我正在尝试在 Oracle 数据库上执行 SQL 脚本(从文件中读取)。我尝试了很多方法,但都没有用。

我有以下方法:

def connect_cx_oracle():

dns_tns = cx_Oracle.makedsn(config.DB_HOST, config.DB_PORT, service_name=config.DB_DBASE)
con = cx_Oracle.connect(user=config.DB_USERNAME, password=config.DB_PASSWORD, dsn=dns_tns)
cur = con.cursor()

fd = open('PurgeProcess_2.sql')
full_sql = fd.read()
cur.prepare(full_sql)
cur.executemany(None, full_sql)
con.commit()

对文件使用 cur.execute 会导致错误。我不能用分号分割文件,因为它是一个脚本。

sql文件的代码是这样的(不是发布整个文件)

SET SERVEROUTPUT ON SIZE UNLIMITED;
DECLARE

CURSOR c_task IS SELECT job_id, task_info_id FROM task WHERE job_id <= myjob_id;

BEGIN

dbms_output.ENABLE(NULL);
dbms_output.put_line('*******************************');
dbms_output.put_line('* Purge job started....... ');
dbms_output.put_line('*******************************');

IF (FROM_date < 30) THEN
dbms_output.put_line(' ');

end IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(' ');
dbms_output.put_line('*******************************');
dbms_output.put_line('* Purge job completed....... ');
dbms_output.put_line('*******************************');
RAISE NO_ITEMS_TO_PROCESS;
END;

FOR i IN 1..myjobIDnumber.COUNT
LOOP
BEGIN
DELETE FROM job WHERE id = myjobIDnumber(i);
IF SQL%ROWCOUNT > 0 THEN
deletecount4 := deletecount4 + SQL%ROWCOUNT;
END IF;
END;
END LOOP;

dbms_output.put_line('Job table records deleted. Number of records deleted is ' || deletecount4);
dbms_output.put_line(' ');

ROLLBACK;
--COMMIT;

dbms_output.put_line('*******************************');
dbms_output.put_line('* Purge job completed....... *');
dbms_output.put_line('*******************************');
EXCEPTION
WHEN NO_ITEMS_TO_PROCESS THEN
NULL;
WHEN DATE_LIMIT_APPROACHED THEN
NULL;
END;

如果我使用 cur.execute(fileName) 我得到

cx_Oracle.DatabaseError: ORA-00922: missing or invalid option

有了 executemany,我得到了

TypeError: parameters should be a list of sequences/dictionaries or an integer specifying the number of times to execute the statement

我不是真正的 sql 专家,任何帮助将不胜感激。问候

最佳答案

cx_Oracle 和其他类似驱动只能execute one statement一次。连executemany()执行一条语句(但有很多数据值)。

做你想做的最简单的方法是:

  • 从您的 SQL 文件中删除所有 SQL*Plus 特定命令,例如 SET,因为如果 cx_Oracle 尝试执行它们,数据库将无法理解它们。它们对 cx_Oracle 毫无意义。

  • 始终使用斜线(而不是分号)来终止 SQL 命令(以及 PL/SQL,当然斜线始终是必需的)

  • 写一个类似RunSqlScript的方法从您的 SQL 文件中读取每个语句并执行它。

一个更明智的解决方案是远离 SQL 文件并在 cx_Oracle 中编写所有语句。

关于python - 如何使用 cx_oracle 执行 SQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57876133/

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