如果在过程中不存在 Oracle 插入

Posted

技术标签:

【中文标题】如果在过程中不存在 Oracle 插入【英文标题】:Oracle insert if not exists inside Procedure 【发布时间】:2019-11-27 18:47:19 【问题描述】:

我有一个程序,应该在检查记录不存在后插入一条新记录。 当我运行它时,甲骨文说:

通知错误 - ORA-01008: 没有 todas las 变量 han sido enlazadas ORA-06512: "SALUD.INSERT_MASS_MULTIMORB_FINALIZA", linea 71 ORA-06512: 在线 1 01008.0

我有这个问题:

  EXECUTE IMMEDIATE 'insert into salud.multimor_paciente_detalle(id_paciente,id_patologia,fecha,puntaje,vigente) select :val1,:val2,:val3,:val4,:val5 from dual where not exists (select * from salud.multimor_paciente_detalle where id_paciente=:val1 and id_patologia=:val2 and fecha=:val3 and puntaje=:val4 and vigente=:val5)'
  using registro.paciente_id,registro.patologia_id,registro.fecha,registro.valor_puntaje,'S';
  EXECUTE IMMEDIATE 'commit';                          

怎么了?

感谢您的帮助

注意:这段代码运行良好:

  EXECUTE IMMEDIATE 'insert into salud.multimor_paciente_detalle(id_paciente,id_patologia,fecha,puntaje,vigente) values(:val1,:val2,:val3,:val4,:val5)'
  using registro.paciente_id,registro.patologia_id,registro.fecha,registro.valor_puntaje,'S';
  EXECUTE IMMEDIATE 'commit';                          

【问题讨论】:

只需使用 MERGE 语句即可。请翻译成英文 错误报告 - ORA-01008:并非所有变量都绑定 ORA-06512:在“SALUD.INSERT_MASS_MULTIMORB_FINALIZA”,第 71 行 ORA-06512:第 1 行 01008.0 这里不需要使用EXECUTE IMMEDIATE。您的语句不是动态的,您可以将它们放在 PL/SQL 块中并使用变量代替 :val1 等运行它们。 我找到了!! EXECUTE IMMEDIATE 'insert into salud.multimor_paciente_detalle(id_paciente,id_patologia,fecha,puntaje,vigente) select :val1,:val2,:val3,:val4,:val5 from dual where not exists (select * from salud.multimor_paciente_detalle where (id_paciente= '||registro.paciente_id||' and id_patologia='||registro.patologia_id||' and fecha='''||registro.fecha||''' and puntaje='||registro.valor_puntaje||' and vigente=''S''))' 使用 registro.paciente_id,registro.patologia_id,registro.fecha,registro.valor_puntaje,'S';立即执行“提交”; 【参考方案1】:

怎么了?

您的查询的具体问题是您在 INSERT 语句和 NOT EXISTS 子查询中重复绑定变量。这意味着您必须在 USING 子句中重复它们,因为存储过程(与匿名块不同)不会记住 EXECUTE IMMEDIATE 语句中的占位符名称。这很烦人,但它也是the documented behaviour。

一个更普遍的问题是构造错误。请改用 MERGE 语句。

最错误的是使用动态SQL。您的语句中没有任何内容需要动态 SQL。正如您的问题所表明的那样,动态 SQL 难以正确编写且难以调试。它在架构上也是不可取的(因为它在生产中存在风险,它阻碍了影响分析,维护起来更棘手)。所以请不要使用它,除非没有其他方法来实现该要求。

【讨论】:

以上是关于如果在过程中不存在 Oracle 插入的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00917: oracle 中不存在插入时缺少逗号

如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?

如果在 mariadb 中不存在 SQL 插入

如果 Oracle 中不存在表,则创建一个表(使用 Java)

如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?

如果C#中不存在则插入[重复]