将DataFrame插入PL/SQL表时遇ORA-01036错误求助
问题原因
你遇到的错误核心是pandas的to_sql方法默认会把原生cx_Oracle连接当成SQLite连接处理,所以才会执行SELECT name FROM sqlite_master...这种SQLite专属语句,Oracle既不认识该系统表,也不兼容对应的参数绑定方式,最终抛出ORA-01036错误。
修复方案
改用SQLAlchemy创建Oracle连接引擎,替代原生cx_Oracle连接传给to_sql,修改后的完整代码如下:
import os import datetime as dt import cx_Oracle import sqlalchemy import pandas as pd import glob # 原代码使用了glob但未导入,需补充 username = '****' password = '****' dsn = '(DESCRIPTION=(CONNECT_TIMEOUT=15)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)\ (ADDRESS=(PROTOCOL=TCP)(HOST=***)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)\ (SERVICE_NAME=***)))' enc = 'utf-8' # 用SQLAlchemy创建Oracle引擎,替换原生cx_Oracle连接 engine = sqlalchemy.create_engine(f'oracle+cx_oracle://{username}:{password}@{dsn}', encoding=enc) sessions = glob.glob('path to daily file/*file with timestamp @ end of name*.csv') latest_sessions = max(sessions, key=os.path.getctime, default=0) dfSessions = pd.read_csv(latest_sessions, sep=',', index_col=False, dtype='unicode') dfSessions.drop([drop several columns], axis=1, inplace=True) # 传入SQLAlchemy引擎执行插入 dfSessions.to_sql('ARRAY_SESSIONS_NEW', engine, schema='BXP6281', if_exists='replace', index=False)
关键说明
- SQLAlchemy引擎的URL格式为
oracle+cx_oracle://用户名:密码@DSN,直接复用你原有的DSN配置即可 - 添加
index=False避免将DataFrame索引作为额外列插入表中(若不需要索引列) - 若SQLAlchemy版本过低,需升级依赖:
pip install --upgrade sqlalchemy cx_Oracle
额外检查项
- 确认用户
BXP6281拥有创建/替换ARRAY_SESSIONS_NEW表的权限 - 检查DataFrame列名是否符合Oracle命名规则(无特殊字符、关键字)
- 若包含日期类型数据,确保Oracle表对应字段类型为DATE或TIMESTAMP
内容的提问来源于stack exchange,提问作者BP12
相关产品推荐
相关产品推荐

