oracle - Oracle SQL:PLS-00049 从序列中选择 NEXTVAL 时绑定变量错误
问题描述
所以,我试图使用 JDBC 来访问我的 Oracle DB,我发现,为了让 JDBC 中的函数正确返回结果,我需要为我的表创建一个迭代器。因此,在四处搜索并弄清楚这意味着什么之后,我想出了以下代码片段来完成它:
--create a sequence for use in the trigger
CREATE SEQUENCE accounts_seq;
--make the trigger on insert or update
CREATE OR REPLACE TRIGGER account_pk_trig
BEFORE INSERT OR UPDATE ON accounts
FOR EACH ROW
BEGIN
IF inserting THEN
SELECT : accounts_seq.NEXTVAL INTO : NEW.accountnumber FROM dual;
ELSE IF updating THEN
SELECT : OLD.accountnumber INTO : NEW.accountnumber FROM dual;
END IF;
END IF;
END;
/
而且,Oracle SQL Developer 不仅在 end 后的分号后面的空格中加上了可怕的红色下划线,而且还在正斜杠上结束了代码块。据我所见,这对于我所见的触发器定义的 Oracle SQL 示例似乎是正确的......我不确定这是否是由于 Oracle SQL Developer 没有将 NEXTVAL 识别为关键字...因为它没有像其他人那样突出显示。
经过一番摆弄,我意识到“ELSE IF”打开了一个我没有关闭的新 IF 语句。但是,仍然出现 Bad Bind 变量错误。
对于那些想要确保“accounts”表中存在“accountnumber”字段的人,这是我对“accounts”表的定义。
CREATE TABLE accounts (
accountnumber NUMBER NOT NULL,
routingnumber NUMBER NOT NULL,
acctype VARCHAR2(20),
balance NUMBER (*,2),
ownerid NUMBER,
CONSTRAINT accountnumber_pk PRIMARY KEY (accountnumber)
);
解决方案
您的 PL/SQL 代码中有两个主要错误:
首先select :
是错误的。你不能只是像这样输入一个冒号。NEW
andOLD
记录确实需要冒号,但没有空格。:new
,不是: new
。
要将查询结果存储在您需要的变量中:
select accounts_seq.NEXTVAL
INTO :NEW.accountnumber
FROM dual;
但是你不需要SELECT
,你可以使用一个简单的变量赋值:
:NEW.accountnumber := accounts_seq.NEXTVAL;
你也有两个END IF
s 虽然你只有一个IF
正如手册中所述,它必须是,而ELSIF
不是ELSE IF
把所有这些放在一起,你的触发器应该是:
CREATE OR REPLACE TRIGGER account_pk_trig
BEFORE INSERT OR UPDATE ON accounts
FOR EACH ROW
BEGIN
IF inserting THEN
:NEW.accountnumber := accounts_seq.NEXTVAL;
ELSIF updating THEN
:NEW.accountnumber := :OLD.accountnumber;
END IF;
END;
/
由于触发器被声明为BEFORE INSERT OR UPDATE
实际上ELSIF
是无用的,因为它只能是insert
或updating
没有别的。所以ELSIF updating THEN
你可以简单地写而不是ELSE
推荐阅读
- actions-on-google - 应用程序在对话流上工作,但不在 Google 模拟器上的操作上
- css - 在引导程序中获取中心词和句子
- arrays - 有多少卡车空了却买了东西
- python - GCP Datalab - 将 CPU 利用率提高到 ~100%
- webstorm - 使用 Babel watcher 编译时如何忽略父“src”目录
- google-api - Google Drive API 权限限制
- angular - Angular 通用服务器 API 请求
- javascript - ui-select 可以边输入边加载数据
- soap - 在使用 SoapUI 中的 Groovy 读取 excel 时接收“Workbook.getWorkbook() 适用于参数类型:(java.io.File) 值:”
- c++ - 如何重载 operator<< 以显示我的列表