在过程中插入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错误,从我的角度来看,一切似乎都很好,我不知道我做错了什么。

错误表示此处不允许列。

错误表明您的一个变量是字符串,因此您必须在语句中用单引号将其括起来;由于它们将在另一个字符串(语句本身(中,因此需要对它们进行转义。

从注释中可以看出,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;

最新更新