sql - 在过程中的 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;
推荐阅读
- c - 尝试使用 olog() 函数连接 oracle 19c 数据库时出现分段错误
- github - GitHub 邀请会过期吗?
- android - 如何修剪左下角的图像以在 XML 中的 cardview 中获得这样的半圆形,在底部修剪图像?附上图片
- javascript - 如何根据名称和值进行点击事件?
- amazon-web-services - AWS 客户端 VPN 访问公共 URL/IP
- python - 如何在 Python 中使用每周时间序列
- sass - Scss 函数不返回计算值
- angular - 儿童模块中的角加载指示符不起作用
- haskell - 如何使用管道将惰性 ByteString 写入文件(在常量内存中)
- amazon-web-services - 如何使用 CDK 生成 AWS SES SMTP 凭证?