2010-08-09 74 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