oracle触发更新

时间:2018-09-28 13:06:11

标签: oracle plsql

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问题?

1 个答案:

答案 0 :(得分:2)

很难说出是什么原因导致了您的错误。但我确实建议您更改方法-不要使用触发器。您应该避免在表触发器中执行非查询DML,例如插入。那会导致各种各样的问题。这是探索问题的一个很好的起点:https://www.oracle.com/technetwork/testcontent/o58asktom-101055.html

我建议您改为创建一个过程以更新表中的行。在该过程中,您可以检查货币是否在变化。如果是这样,请在该过程中将插入作为事务的一部分执行。

然后将包含该过程的程序包授予开发人员模式,但不要让他们直接更新表。

这样,您可以确保在更新行时始终运行具有所有错误处理和恢复逻辑的完整事务。