以下是我用来创建表格,序列和触发器的代码
DROP TABLE CDR.ExtDL_JobStatus;
--
-- TABLE: CDR.ExtDL_JobStatus
--
CREATE TABLE CDR.ExtDL_JobStatus(
Id NUMBER(38, 0) NOT NULL,
ShortName NUMBER(38, 0) NOT NULL,
Description NUMBER(38, 0) NOT NULL,
CONSTRAINT PK_ExtDL_JobStatus PRIMARY KEY (Id)
)
;
Declare NumOfSequences NUMBER :=0;
Begin
Select COUNT(*)
INTO NumOfSequences
FROM All_Sequences
WHERE 1=1
And upper (Sequence_Owner) = upper ('CDR')
And upper (Sequence_Name) = upper ('ExtDL_JobStatus_Seq');
If NumOfSequences > 0 Then
Execute IMMEDIATE 'DROP SEQUENCE CDR.ExtDL_JobStatus_Seq';
End If;
End;
/
CREATE SEQUENCE CDR.ExtDL_JobStatus_Seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOMINVALUE
;
/
Declare NumOfTriggers NUMBER :=0;
Begin
SELECT COUNT(*)
INTO NumOfTriggers
FROM All_Triggers
WHERE 1=1
And upper (Owner) = upper ('CDR')
And upper (Trigger_Name) = upper ('ExtDL_JobStatus_SeqTrg');
If NumOfTriggers > 0 Then
Execute IMMEDIATE 'DROP SEQUENCE CDR.ExtDL_JobStatus_SeqTrg';
End If;
End;
/
CREATE TRIGGER CDR.ExtDL_JobStatus_SeqTrg
BEFORE INSERT
ON CDR.ExtDL_JobStatus
FOR EACH ROW
WHEN (new.Id IS NULL)
BEGIN
SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual;
END;
/
INSERT INTO ExtDL_JobStatus (Id, ShortName, Description) Values (0, 'Success', 'Fail')
/
SELECT * FROM ExtDL_JobStatus
当我执行代码时,我得到以下输出
DROP TABLE CDR.ExtDL_JobStatus succeeded.
CREATE TABLE succeeded.
anonymous block completed
CREATE SEQUENCE succeeded.
anonymous block completed
Warning: execution completed with warning
TRIGGER CDR.ExtDL_JobStatus_SeqTrg Compiled.
Error starting at line 62 in command:
INSERT INTO ExtDL_JobStatus (Id, ShortName, Description) Values (0, 'Success', 'Fail')
Error at Command Line:62 Column:12
Error report:
SQL Error: ORA-04098: trigger 'CDR.EXTDL_JOBSTATUS_SEQTRG' is invalid and failed re-validation
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger.
*Action: Options are to resolve the compilation/authorization errors,
disable the trigger, or drop the trigger.
ID SHORTNAME DESCRIPTION
---------------------- ---------------------- ----------------------
0 rows selected
是什么让我的触发器无效?
答案 0 :(得分:6)
警告:执行完成后 警告TRIGGER CDR.ExtDL_JobStatus_SeqTrg已编译。
这是您的触发器编译失败的地方。
sql> CREATE TRIGGER ExtDL_JobStatus_SeqTrg
2 BEFORE INSERT
3 ON ExtDL_JobStatus
4 FOR EACH ROW
5 WHEN (new.Id IS NULL)
6 BEGIN
7 SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual;
8 END;
9 /
Warning: Trigger created with compilation errors.
sql> show errors;
Errors for TRIGGER EXTDL_JOBSTATUS_SEQTRG:
LINE/COL ERROR
-------- -----------------------------------------------------------------
2/9 PL/SQL: SQL Statement ignored
2/16 PL/SQL: ORA-02289: sequence does not exist
问题是因为您在代码中使用了 ExtDL_JobStatus_SeqTrg ,并且您创建的序列是 ExtDL_JobStatus_Seq 。
另外,如果您尝试运行这样的脚本来创建(编译)对象,我建议您在每个触发器/过程/函数creatin语句之后添加以下子句。
SHOW ERRORS;
如果你的陈述出现了,那就不会产生任何错误。如果有任何错误,您将获得错误的详细描述,而不必再次执行脚本。
答案 1 :(得分:2)
这是一个简单的拼写错误:您的序列称为ExtDL_JobStatus_Seq
,但在您的触发器中,您引用了ExtDL_JobStatus_SeqTrg.nextval
。
为了将来参考,最好在每次调用PL / SQL(触发器,过程等)的调用之后包含一个在脚本中显示错误的调用。像这样:
CREATE TRIGGER CDR.ExtDL_JobStatus_SeqTrg
BEFORE INSERT
ON CDR.ExtDL_JobStatus
FOR EACH ROW
WHEN (new.Id IS NULL)
BEGIN
SELECT ExtDL_JobStatus_SeqTrg.nextval into :new.Id from dual;
END;
/
show errors
顺便说一句,匿名区块中存在相同的拼写错误,导致该序列失败。
答案 2 :(得分:1)
除了前面提到的所有内容之外,还有两个错误/错误:
DROP SEQUENCE
。