【问题标题】:Oracle Trigger with Multiple sequences filled on condition with relation to another sequence and column value具有多个序列填充的 Oracle 触发器与另一个序列和列值相关的条件
【发布时间】:2017-07-28 19:10:25
【问题描述】:

我有如下分类产品的表格

   Category_ID     VARCHAR2 (1024)  NOT NULL, --PK
   Category_Desc   VARCHAR2 (1024)  NOT NULL,
   Class1_ID       VARCHAR2 (1024),
   Class1_Desc     VARCHAR2 (1024),
   Class2_ID       VARCHAR2 (1024),
   Class2_Desc     VARCHAR2 (1024),
   Class3_ID       VARCHAR2 (1024),
   Class3_Desc     VARCHAR2 (1024),
   Notes           VARCHAR2 (1024),

Category_ID 由序列Seq_Category_ID 填充,现在使用触发器 我想做的是

  • 用列Category_ID 的值填充列Class1_ID 与 它是序列名称Seq_Class1_ID

  • 用列 Category_ID 的值填充列 Class2_IDClass1_ID 连接 与它连接的是序列名称 Seq_Class2_ID

等等……

但我收到错误提示

[错误] PLS-00103 (11: 4): PLS-00103: 遇到符号“{”时 期待以下之一:

( begin case declare exit for goto if loop mod null pragma raise 使用时返回选择更新

mod 继续当前 sql 执行 forall 合并 [错误] PLS-00103 (13: 2):PLS-00103:遇到符号“}”时 期待以下之一:

( begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with

终于

有没有更好的方法来处理我所说的案例?

CREATE OR REPLACE TRIGGER Trg_Category_ID_Seq
   BEFORE INSERT
   ON Product_Classification
   FOR EACH ROW
   WHEN (NEW.Category_ID IS NULL)
BEGIN

   :NEW.Category_ID := Seq_Category_ID.NEXTVAL;

   IF(NEW.Class1_Desc IS NOT NULL AND NEW.Category_ID IS NOT NULL AND NEW.Class1_ID IS NULL ) THEN
   {
    INSERT INTO Product_Classification (Class1_ID)VALUES(NEW.Category_ID||Seq_Class1_ID.NEXTVAL);
    }

END;

【问题讨论】:

    标签: oracle oracle12c database-trigger


    【解决方案1】:

    在块语句(或触发器)中使用if conditions 时,无需使用{},您可以使用end if; 关闭它

    这样可以解决你的问题

    CREATE OR REPLACE TRIGGER Trg_Category_ID_Seq
       BEFORE INSERT
       ON Product_Classification
       FOR EACH ROW
    
    when (NEW.Category_ID IS NULL)
    BEGIN
    
       :NEW.Category_ID := Seq_Category_ID.NEXTVAL;
    
    
       IF(NEW.Class1_Desc IS NOT NULL AND NEW.Category_ID IS NOT NULL AND NEW.Class1_ID IS NULL ) THEN
    
        INSERT INTO Product_Classification (Class1_ID)VALUES(NEW.Category_ID||Seq_Class1_ID.NEXTVAL);
       end if;
    
    END;
    

    【讨论】:

    • 谢谢...有没有更好的方法来处理我所说的情况?
    【解决方案2】:

    代码中的语法问题:

    • 您处理IF THEN 块的方式,如上所述
    • 您在使用 NEW 而不是 :NEW 时缺少一些 ':'

    应该如何:

    CREATE OR REPLACE TRIGGER Trg_Category_ID_Seq
       BEFORE INSERT
       ON Product_Classification
       FOR EACH ROW
       WHEN (NEW.Category_ID IS NULL)
    BEGIN
    
       :NEW.Category_ID := Seq_Category_ID.NEXTVAL;
    
       IF(:NEW.Class1_Desc IS NOT NULL AND :NEW.Category_ID IS NOT NULL AND :NEW.Class1_ID IS NULL ) THEN
    
        INSERT INTO Product_Classification (Class1_ID)VALUES(:NEW.Category_ID||Seq_Class1_ID.NEXTVAL);
       END IF;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2022-01-05
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多