我在执行下面的触发器时遇到一些问题:
CREATE OR REPLACE TRIGGER AFTERINSERTCREATEBILL
AFTER INSERT
ON READING
FOR EACH ROW
DECLARE
varReadNo Int;
varMeterID Int;
varCustID Varchar(10);
BEGIN
SELECT SeqReadNo.CurrVal INTO varReadNo FROM DUAL;
Select MeterID INTO varMeterID
From Reading
Where ReadNo = varReadNo;
Select CustID INTO varCustID
From Address A
Join Meter M
on A.postCode = M.postCode
Where M.MeterID = varMeterID;
INSERT INTO BILL VALUES
(SEQBILLNO.NEXTVAL, SYSDATE, 'UNPAID' , 100 , varCustID , SEQREADNO.CURRVAL);
END;
错误信息:
*原因:触发器(或在中引用的用户定义的 plsql 函数)
该语句)试图查看(或修改)一个表
在被触发它的语句修改的过程中。
*操作:重写触发器(或函数),使其不读取该表。
这是否意味着我不应该从表 Reading 中检索任何详细信息?
我相信当我在插入值时从表读取中检索数据时会出现此问题:
SELECT SeqReadNo.CurrVal INTO varReadNo FROM DUAL;
Select MeterID INTO varMeterID
From Reading
Where ReadNo = varReadNo;
无论如何,有办法解决这个问题吗?或者有更好的方法来做到这一点吗?输入表 Reading 后,我需要在表 BILL 中插入一个新行,其中 ReadNo 需要引用我刚刚插入的 ReadNo。
您无法在行触发器中从同一表中检索记录。您可以使用 :new 和 :old 从实际记录中访问值(这是您的情况吗?)。然后触发器可以重写为
CREATE OR REPLACE TRIGGER AFTERINSERTCREATEBILL
AFTER INSERT
ON READING
FOR EACH ROW
DECLARE
varCustID Varchar(10);
BEGIN
Select CustID INTO varCustID
From Address A
Join Meter M
on A.postCode = M.postCode
Where M.MeterID = :new.MeterID;
INSERT INTO BILL VALUES
(SEQBILLNO.NEXTVAL, SYSDATE, 'UNPAID' , 100 , varCustID , SEQREADNO.CURRVAL);
END;
如果需要从 READING 表中查询其他记录,则必须使用语句触发器、行触发器和 PLSQL 集合的组合。很好的例子是AskTom.oracle.com http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)