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

无法通过Python oracledb向OCI自治数据库23c插入数据求助

问题排查方案

针对INSERT ALL执行无报错但查不到数据的情况,按以下优先级排查:

1. 事务未提交

oracledb默认是手动提交模式,执行插入后如果没显式提交事务,数据仅存在于当前会话的未提交事务中,退出会话或换其他会话查询都看不到。解决办法:
执行完INSERT ALL语句后,调用连接对象的commit()方法:

connection.commit()

如果用了with上下文管理器,要确保块内手动提交,或者配置连接时开启自动提交(不推荐生产环境)。

2. INSERT ALL语法不完整

标准Oracle INSERT ALL语句需要以SELECT 1 FROM DUAL结尾触发执行(分区表特殊变种除外),要是代码里漏了这部分,语句可能根本没实际执行。正确语法示例:

INSERT ALL
  INTO users (id, name) VALUES (:1, :2)
  INTO logs (user_id, action) VALUES (:1, 'insert')
SELECT 1 FROM DUAL;

检查你写的INSERT ALL是否包含最后的SELECT部分,23c自治库仍遵循这个要求。

3. 绑定变量传递错误

如果用了绑定变量,确认参数数量和值是否匹配语句里的占位符。比如参数数量不匹配时,oracledb可能不会报错,但实际没插入数据。验证示例:

cursor.execute("INSERT ALL INTO t(col1) VALUES (:v1) SELECT 1 FROM DUAL", v1=123)

可以打印绑定参数值,确认是否符合预期。

4. 表名/Schema不匹配

确认插入和查询的是同一个表:

  • 有没有可能插入到了其他Schema的同名表?比如当前用户是APP_USER,但表属于ADMIN,插入时没加前缀ADMIN.TABLE_NAME,查询却查的是当前Schema的表。
  • 检查表名大小写:Oracle默认表名大写,要是建表时用双引号指定了小写,插入和查询时也得用双引号包裹表名。

5. 会话只读或隔离级别问题

确认当前会话不是只读模式,执行以下SQL检查:

SELECT transaction_read_only FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID');

如果结果是YES,说明会话只读,无法插入数据。

内容的提问来源于stack exchange,提问作者Moravas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:09