You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:22:19