我有分类产品的表格如下
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;
答案 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;