ORA-01036错误排查:Python用oracledb插入Oracle数据失败
解决ORA-01036: illegal variable name/number错误的步骤
出现这个错误的核心原因是绑定变量与传入参数不匹配,或者Oracle/Long类型字段的绑定规则未满足,以下是针对性的解决方法:
1. 移除不必要的绑定配置
你设置了cur.bindarraysize = 1,这个参数是用于批量插入(executemany)时的配置,单条execute插入不需要,反而可能干扰绑定逻辑。直接删除这行代码:
# 移除这行 # cur.bindarraysize = 1
2. 检查绑定变量与字典键的完全匹配
虽然你的代码看起来变量名一致,但再仔细核对以下内容:
- 确保SQL中的绑定变量名(如
:txt、:pred_cat)和字典data中的键(如"txt"、"pred_cat")大小写完全一致(Oracle绑定变量默认大小写敏感) - 确认没有多余的空格、拼写错误(比如把
num_anon写成num_anom) - 确保字典中没有SQL未使用的多余键,或SQL中存在字典未定义的绑定变量
3. 针对LONG类型字段的特殊绑定处理
Oracle的LONG类型属于过时类型,oracledb对其绑定有特殊要求,你可以显式指定绑定类型来解决:
# 先为LONG字段创建绑定变量 txt_var = cur.var(oracledb.LONG_STRING) txt_var.setvalue(0, 'anon_text') # 修改data字典,替换原txt值 data = { "subject": 'anon_subj', "txt": txt_var, "pred_cat": pred_class, "true_cat": "", "prob": str(probability), "num_anon": num_anon_tokens, "caseid": str(caseID) }
4. 尝试切换为位置绑定(备选方案)
如果命名绑定仍有问题,可以换成位置绑定来排除命名兼容性问题:
# SQL使用位置占位符 statement= "INSERT INTO MY_ORACLE_TABLE(SUBJECT, TEXT, PREDICTED_CATEGORY, TRUE_CATEGORY, PROBABILITY, NUMBER_ANONYMIZED_TOKENS, CASEID) VALUES (:1, :2, :3, :4, :5, :6, :7)" # 数据改为列表顺序对应占位符 data = [ 'anon_subj', 'anon_text', pred_class, "", str(probability), num_anon_tokens, str(caseID) ] # 执行插入 cur.execute(statement, data)
内容的提问来源于stack exchange,提问作者Daniil Yefimov
相关产品推荐
相关产品推荐

