oracle在更新时触发

oracle在更新时触发,oracle,plsql,Oracle,Plsql,我在更新时有这个触发器,它可以正常工作,直到没有与旧货币相同的货币id为止。。当我尝试插入存在的货币时,我得到错误。 更新“货币”,第20行 ORA-04088:执行触发器“更新货币”时出错 如何解决已有货币id的问题?很难说是什么导致了您的错误。但我建议您改变方法,不要使用触发器。您应该避免在表触发器中执行非查询DML类型的插入。这可能会导致各种问题。这是探索is的一个良好起点起诉: 我建议您改为创建一个被调用的过程来更新表中的一行。在该过程中,您可以检查货币是否在更改。如果是,请在该过程中作

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


如何解决已有货币id的问题?

很难说是什么导致了您的错误。但我建议您改变方法,不要使用触发器。您应该避免在表触发器中执行非查询DML类型的插入。这可能会导致各种问题。这是探索is的一个良好起点起诉:

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

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


通过这种方式,您可以确保在更新行时始终运行完整事务以及所有错误处理和恢复逻辑。

很难说是什么导致了您的错误。但我建议您更改方法,不要使用触发器。您应该避免在表触发器中执行非查询DML类型的插入。这可能会导致各种各样的问题。这里是探讨这些问题的一个很好的起点:

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

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


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

请发布完整的错误堆栈。请取消删除您的问题->。如果对您有帮助,请接受我的回答。谢谢。请发布完整的错误堆栈。请取消删除您的问题->。请接受我的回答如果对你有帮助的话,谢谢。
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;