首页 > 解决方案 > “SET DEFINE OFF”在 Python cx_Oracle 中不起作用

问题描述

con = cx_Oracle.connect(connection_string)
cur = con.cursor()
cur.execute("SET DEFINE OFF")

正在抛出错误:

DatabaseError
Traceback(最近一次调用最后一次)在

  1 con = cx_Oracle.connect(connection_string)
  2 cur = con.cursor()
  3 cur.execute("SET DEFINE OFF")

DatabaseError:ORA-00922:缺少或无效选项

标签: sqlpython-3.xcx-oracle

解决方案


如注释中所述,SET DEFINE 是一个 SQL*Plus 命令,不被 cx_Oracle 解释。您收到 ORA 错误是因为 cx_Oracle 将语句发送到数据库,而数据库只处理 SQL 或 PL/SQL 语句。

您应该使用绑定变量而不是(不可用的)替换变量。任何类型的字符串替换或插值都是可扩展性问题和安全风险。绑定变量解决了这些问题。(可以说您也可以在 SQL*Plus 中使用绑定变量)。

看看像BindInsert.py这样的例子:

rows = [ (1, "First" ),
         (2, "Second" ),
         (3, "Third" ),
         (4, "Fourth" ),
         (5, "Fifth" ),
         (6, "Sixth" ),
         (7, "Seventh" ) ]

cursor = connection.cursor()
cursor.executemany("insert into mytab(id, data) values (:1, :2)", rows)

检查 cx_Oracle 文档,如

如果要执行 .SQL 文件,则需要编写某种解析器来提取 SQL 语句并单独执行它们。和/或确保简化有关语句结束符的 .SQL 文件语法。例如,查看 cx_Oracle 如何使用此技术通过RunSqlScript安装其示例模式。


推荐阅读