代码之家  ›  专栏  ›  技术社区  ›  civesuas_sine

更新时触发oracle

  •  0
  • civesuas_sine  · 技术社区  · 6 年前
    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;
    

    我在更新时有这个触发器,它可以正常工作,直到没有与旧货币相同的货币id为止。。当我试图插入货币存在我得到错误。 更新“货币”,第20行

    1 回复  |  直到 6 年前
        1
  •  2
  •   Steven Feuerstein    6 年前

    很难说是什么导致了你的错误。但我建议你改变你的方法-不要使用触发器。应该避免在表触发器中执行非查询DML类型的插入。这会导致各种各样的问题。以下是探讨这些问题的一个很好的起点: https://www.oracle.com/technetwork/testcontent/o58asktom-101055.html

    我建议您创建一个被调用的过程来更新表中的行。在这个过程中,您可以检查货币是否在变化。如果是这样,则作为该过程中事务的一部分执行insert。

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

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