CREATE TABLE COUNTRY
(
COUNTRY_ID VARCHAR2(2 BYTE) NOT NULL,
NAME VARCHAR2(200 BYTE),
CURRENCY_ID VARCHAR2(3 BYTE) DEFAULT 'EUR'
)
CREATE TABLE CURRENCY
(
CURRENCY_ID NUMBER NOT NULL,--this is sequnce
NAME VARCHAR2(20 BYTE),
VALUE NUMBER,
BANK_PERCENTAGE NUMBER
)
CREATE OR REPLACE TRIGGER update_currency
AFTER UPDATE
ON SOFTDEV.COUNTRY
FOR EACH ROW
DECLARE
BEGIN
if :new.currency_id = :old.currency_id
then
null; -- if the currency_id exists then to nothing
else
INSERT INTO CURRENCY
( CURRENCY_ID,
NAME,
VALUE,
BANK_PERCENTAGE)
VALUES --line 20
( CURRENCY_ID_SEQ.nextval,
:new.currency_id,
1,
0);
end if;
END;
我在更新时具有此触发器,直到没有与旧货币相同的currency_id时,它才能正常工作。当我尝试插入存在的货币时,出现错误。 UPDATE_CURRENCY”,第20行 ORA-04088:执行触发器UPDATE_CURRENCY时出错
如何解决已经存在的currency_id问题?
答案 0 :(得分:2)
很难说出是什么原因导致了您的错误。但我确实建议您更改方法-不要使用触发器。您应该避免在表触发器中执行非查询DML,例如插入。那会导致各种各样的问题。这是探索问题的一个很好的起点:https://www.oracle.com/technetwork/testcontent/o58asktom-101055.html
我建议您改为创建一个过程以更新表中的行。在该过程中,您可以检查货币是否在变化。如果是这样,请在该过程中将插入作为事务的一部分执行。
然后将包含该过程的程序包授予开发人员模式,但不要让他们直接更新表。
这样,您可以确保在更新行时始终运行具有所有错误处理和恢复逻辑的完整事务。