2010-08-09 8 views
5

Oto kod, który używam do tworzenia tabeli, sekwencję i spustwyzwalania jest nieważny i nie udało ponowną walidację

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 

Kiedy wykonać kod, pojawia się następujący komunikat

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 

Co powoduje, że mój wyzwalacz jest nieważny?

+1

Raz spotkałem podobny problem. Mój problem był przyczyną, ponieważ więcej niż jeden wyzwalacz o tej samej nazwie różni się tylko na obudowie. Sprawdziłbym, czy to nie ten sam problem, jaki masz. – Falle1234

+0

@ Falle1234 Sprawdziłem, że 'select * from all_triggers'; bez duplikatów. –

+2

poinformuj nas, jaki jest aktualny błąd: "pokaż błąd CDR.EXTDL_JOBSTATUS_SEQTRG' –

Odpowiedz

6

Warning: wykonanie zakończona ostrzegania TRIGGER CDR.ExtDL_JobStatus_SeqTrg skompilowany.

W tym miejscu kompilacja wyzwalacza nie powiodła się.

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 

Problemem jest to, ponieważ używasz ExtDL_JobStatus_SeqTrg w kodzie, a utworzona sekwencja jest ExtDL_JobStatus_Seq.

Ponadto, jeśli próbujesz uruchomić taki skrypt do tworzenia (kompilowania) obiektów, proponuję dodać następującą klauzulę po każdym wywołaniu spust/procedura/funkcja creatin.

SHOW ERRORS; 

Jeśli Twoje oświadczenie się potwierdzi, nie będzie to powodować żadnych błędów. Jeśli są jakieś eros, będziesz miał szczegółowy opis błędów zamiast ponownego uruchamiania skryptu.

+0

' POKAŻ BŁĘDY "działa ładnie - Dziękujemy! –

2

To prosta klika: twoja sekwencja nazywa się ExtDL_JobStatus_Seq, ale w twoim spustu odwołujesz się do ExtDL_JobStatus_SeqTrg.nextval.

Do przyszłego użytku warto dołączyć wywołanie, aby pokazać błędy w skryptach po każdym wywołaniu, które kompiluje PL/SQL (wyzwalacze, procedury itp.). W ten sposób:

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 

Nawiasem mówiąc, w anonimowym bloku występuje ta sama literówka, co oznacza upuszczenie sekwencji.

+0

tx za wskazanie dodatkowej literówki również –

1

Oprócz wszystkiego wcześniej wspomniano, istnieją dwa dodatkowe literówki/błędy:

  1. Blok/SQL anonimowy PL który próbuje upuść spust rzeczywiście mówi DROP SEQUENCE.
  2. Instrukcja wstawiania próbuje wstawić ciągi znaków do kolumn ShortName i Description, które są zdefiniowane jako NUMBER (38, 0).
+0

Zauważyłem rzecz o typach danych. W jakiś sposób wszystko zmieniło się w jedną domenę - zmieniłem ją z powrotem na każdą domenę –

Powiązane problemy