我正在使用 Oracle SQL 数据库,并且我想运行该命令
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
当我从 SQL Developer 应用程序手动运行它时,它工作正常。但是,当我使用
oracledb
模块从 Python 运行它时,出现以下错误:
Error running SQL script: ORA-00922: missing or invalid option
Help: https://docs.oracle.com/error-help/db/ora-00922/
需要明确的是,我在使用 Python 建立与 Oracle 的连接时没有遇到问题。
这是我的代码:
import oracledb
import pandas
import os
import csv
import logging
import datetime
import sys
STARTER_QUERY = r"ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';"
Config = {}
exec(open("config/info-sql.txt").read(), Config)
# print(Config)
def get_connection():
connection = oracledb.connect(user=Config["username"], password=Config["password"], dsn=get_dsn(Config['ip'], Config['port'], Config['service_name']))
return connection
def run_sql_script(connection, sql_script):
try:
print(f"SQL script: {sql_script}")
logging.info(f"SQL script: {sql_script}")
cursor = connection.cursor()
cursor.execute(sql_script)
columns = [i[0] for i in cursor.description]
data = cursor.fetchall()
df = pandas.DataFrame(data, columns=columns)
return df
except Exception as e:
print(f"Error running SQL script: {e}")
return None
connection = get_connection()
if connection is None:
sys.exit(0)
run_sql_script(connection, STARTER_QUERY)
我如何格式化字符串有问题吗?任何帮助,将不胜感激。
这个错误与字符串格式化无关,而是与尝试使用
oracledb
库的游标执行 DDL(数据定义语言)语句有关,而该库用于数据检索操作。
ALTER SESSION
是一个 DDL 语句,它会修改会话的设置,而不是返回任何数据。另一方面,
cursor.execute()
及其后续方法(如
fetchall()
)设计用于处理从
SELECT
等 DML(数据操作语言)语句返回的数据。
要解决此问题,请在
oracledb
连接对象上使用
cursor.execute()
方法来执行
ALTER SESSION
语句:
import oracledb
# ... 你的其他导入和代码 ...
STARTER_QUERY = "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'"
# ... 你的其他代码 ...
def run_sql_script(connection, sql_script):
try:
print(f"SQL script: {sql_script}")
logging.info(f"SQL script: {sql_script}")
with connection.cursor() as cursor:
cursor.execute(sql_script)
connection.commit() # 提交 DDL 语句的更改
# 不需要提取数据或创建 DataFrame 用于 DDL 语句
return # 返回 None 或任何指示成功的值
except Exception as e:
print(f"Error running SQL script: {e}")
return None
# ... 你的其他代码 ...
此代码直接在连接上使用
cursor.execute()
来执行
ALTER SESSION
语句。由于此操作不会返回任何数据,因此我们删除了
fetchall()
和 DataFrame 创建。我们还添加了
connection.commit()
,因为它是一个 DDL 语句,需要提交。
此更改应该可以解决
ORA-00922
错误,并允许使用
oracledb
在 Python 脚本中设置会话日期格式。请记住,此更改会影响连接的整个会话,并且对使用同一连接执行的后续查询保持有效。