'Bad bind variable' 在触发器中

'Bad bind variable' in a trigger

我使用 SQL 开发人员编写的代码存在以下触发器问题:

CREATE OR REPLACE TRIGGER AGGIORNA_QTA 
AFTER INSERT ON ACQUISTI 
FOR EACH ROW 
BEGIN
  update prodotti set qta=:old.qta-(select qtaacq from acquisti
    where utente=:new.utente and prodotto=:new.prodotto and data=:new.data);
END;

这是数据库table定义:

CREATE TABLE PRODOTTI(  
 CODICE NUMBER, 
 NOME VARCHAR2(10), 
 QTA NUMBER, 
 PREZZO NUMBER, 
 PRIMARY KEY ("CODICE"))

CREATE TABLE UTENTI(
 USERNAME VARCHAR2(10), 
 NOME VARCHAR2(10), 
 COGNOME VARCHAR2(10), 
 PRIMARY KEY ("USERNAME"))

CREATE TABLE ACQUISTI(
 UTENTE VARCHAR2(10), 
 PRODOTTO NUMBER, 
 DATA DATE, 
 QTAACQ NUMBER, 
 PRIMARY KEY (UTENTE,PRODOTTO,DATA),
 FOREIGN KEY (UTENTE) REFERENCES UTENTI (USERNAME),
 FOREIGN KEY (PRODOTTO) REFERENCES PRODOTTI (CODICE)) 

问题是我不断收到以下错误:

Error(2,29): PLS-00049: bad bind variable 'OLD.QTA'

我做错了什么?

问题是您试图设置错误的变量 table,ACQUISTI 没有名为 qta 的列,但 PRODOTTI table 有一个名为 qta[=10= 的列]

oldnew 伪行仅存在于触发器所针对的 table 中。对于你正在更新的 table 你可以直接参考 qta ,它会使用当前值进行计算:

update prodotti set qta = qta - ...

您也没有指定要更新 table 中的哪一行,因此您需要添加如下内容:

where codice = :new.prodotto

但是你试图从你要插入的同一个 table select,所以你会得到一个 ORA-04091 变异 table 错误。当您基于主键进行查询时,您不能期望返回超过一行,因此您根本不需要查询,您可以只使用新行的 qtaacq

CREATE OR REPLACE TRIGGER AGGIORNA_QTA 
AFTER INSERT ON ACQUISTI 
FOR EACH ROW 
BEGIN
  update prodotti set qta = qta - :new.qtaacq
  where codice = :new.prodotto;
END;
/

SQL Fiddle demo.

您可能会发现这并不能像您在多用户环境中期望的那样可靠地维护主 table 中的数量。同时插入可能会看到相同的旧 qta 值并导致丢失更新。