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的问题?
很难说是什么导致了你的错误。但我确实建议你改变你的方法 - 而不是使用触发器。应避免在表触发器中执行非查询 DML(如插入(。这可能会导致各种问题。以下是探索这些问题的良好起点:https://www.oracle.com/technetwork/testcontent/o58asktom-101055.html
我建议您改为创建一个调用的过程来更新表中的行。在此过程中,您可以检查货币是否在变化。如果是这样,请在该过程中作为事务的一部分执行插入。
然后向开发人员架构授予对包含该过程的包的执行,但不要让他们直接更新表。
这样,您就可以确保在更新行时始终运行完整事务以及所有错误处理和恢复逻辑。