首页 > 解决方案 > 在过程中的 oracle 语句中插入错误

问题描述

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES (' || SII_BCK_TAB_ID_SEQ.CURRVAL || ',' || id_seq || ',' || id_fk || ')';
DBMS_OUTPUT.PUT_LINE(stmt_ins_bck);
EXECUTE IMMEDIATE stmt_ins_bck;

当我尝试执行该插入时,我得到 ORA-00984 错误,我看到它的方式似乎一切都很好,我无法弄清楚我做错了什么。

错误说这里不允许列。

标签: sqloracleplsqloracle11gprocedure

解决方案


该错误表明您的变量是一个字符串,因此您必须在语句中将其括在单引号中;并且因为它们将在另一个字符串中 - 语句本身 - 它们需要被转义。

从评论来看,它似乎id_seq是一个字符串并且id_fk是一个数字,所以类似于:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES ('
  || SII_BCK_TAB_ID_SEQ.CURRVAL || ',''' || id_seq || ''',' || id_fk || ')';
-------------------------------------^^................^^ escaped single quotes
EXECUTE IMMEDIATE stmt_ins_bck;

但是使用绑定变量更简单,通常更有效:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES (:v1,:v2,:v3)';
EXECUTE IMMEDIATE stmt_ins_bck USING SII_BCK_TAB_ID_SEQ.CURRVAL, id_seq, id_fk;

或者可能,因为序列引用在语句的固定部分是合理的:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES (SII_BCK_TAB_ID_SEQ.CURRVAL,:v1,:v2)';
EXECUTE IMMEDIATE stmt_ins_bck USING id_seq, id_fk;

推荐阅读