具有多个序列的Oracle触发器在与另一个序列和列值相关的条件下填充

时间:2017-03-08 09:31:54

标签: oracle oracle12c database-trigger

我有分类产品的表格如下

   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填充 我想做的是

  • 填充列Class1_ID,列Category_ID的值与其连接 它是序列名Seq_Class1_ID

  • 填充列Class2_ID,其值为Category_ID,与Class1_ID连接并与其连接是序列名称Seq_Class2_ID

依旧......

但我收到的错误就是

  

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

     

(如果loop mod null pragma raise,则开始为goto声明退出   使用时返回选择更新      

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

     

(如果循环mod为,则开始案例声明其他elsif结束退出goto   null pragma raise返回选择更新时使用

终于

有没有更好的方法来管理我正在讨论的案例?

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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

代码中的语法问题:

  • 处理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;