【问题标题】:insert error in oracle statement inside procedure在过程中的 oracle 语句中插入错误
【发布时间】:2019-04-10 02:36:53
【问题描述】:
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 错误,我看到它的方式似乎一切都很好,我无法弄清楚我做错了什么。

错误说这里不允许列。

【问题讨论】:

  • 您要连接到语句中的变量是什么数据类型?
  • @AlexPoole id_seq 是 varchar2 和 id_fk sii_bck_cfg_tab.id_bck_cfg_tab%type;但我也尝试将 id_fk 作为其声明的数字插入。

标签: sql oracle plsql oracle11g procedure


【解决方案1】:

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

从评论看来,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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多