2010-08-09 68 views
5

这里是我用它来创建一个表,序列和触发触发无效,未能再验证

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 

是什么让我的触发器失效?

+1

我也遇到了类似的问题一次。我的问题是由于只有一个以上的触发器具有相同的名称,而且仅在套管上有所不同。我会检查它是不是你有同样的问题。 – Falle1234 2010-08-09 13:47:38

+0

@ Falle1234我检查了'select * from all_triggers';没有重复。 – 2010-08-09 13:51:15

+2

请让我们知道什么是真正的错误是:'显示错误CDR.EXTDL_JOBSTATUS_SEQTRG' – 2010-08-09 13:59:47

回答

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

另外,如果你想运行一个这样的脚本来创建(编译)的对象,我会建议你每次触发/过程/函数肌酸语句后添加下列条款。

SHOW ERRORS; 

如果你的发言succceds,这将只是产生任何错误。如果有任何错误,您将有错误的详细描述,而不必再次执行脚本。

+0

'SHOW ERRORS'很好地工作 - 谢谢! – 2010-08-09 14:17:42

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 

顺便说一句,在匿名块中有相同的错字,试图删除序列。

+0

TX您指出的附加错字以及 – 2010-08-09 14:17:09

1

除了前面提到的一切,还有另外两个错别字/错误:

  1. ,试图删除触发器匿名PL/SQL块实际上说的DROP SEQUENCE
  2. 的插入语句试图插入字符的字符串进SHORTNAME和说明列,这两者都定义为NUMBER(38,0)。
+0

我注意到了数据类型的问题。不知何故,一切都变成了一个域 - 我将它改回到每个域 – 2010-08-09 19:59:18