我有执行低于触发一些问题:创建触发器插入到另一个表
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;
它的存在,无论如何要解决这个问题?还是有更好的方法来做到这一点?在输入表之后,我需要在表格BILL中插入一个新的行读取ReadNo需要引用我刚插入的ReadNo的位置。
您需要找出'编译/授权失败的触发器'期间发生了什么错误然后给我们那个错误信息。如果您有TOAD,请转到Schema Browser中的触发器,右键单击并编译,它应该会显示错误消息。如果你只是在SQLPLUS中运行脚本,我想它应该给你一个错误信息。另外我建议你在你的INSERT语句中添加一个列表来减少可能的错误。 –
你可以尝试在触发器外面插入表'BILL'吗?并检查您是否具有您在触发器中使用的表的读/写权限。这将帮助您调试问题。 – user75ponic
我试图插入表格比尔无触发器,它似乎工作正常。我试着对触发器中的值进行硬编码,它的工作也很好,我相信问题在于下面的语句:SELECT SeqReadNo.CurrVal INTO varReadNo FROM DUAL; Select MeterID INTO varMeterID From Reading Where ReadNo = varReadNo; – FirstTimer