2010-08-09 45 views
5

Đây là mã mà tôi sử dụng để tạo ra một bảng, một chuỗi và một còTrigger là không hợp lệ và không tái xác nhận

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 

Khi tôi thực thi mã, tôi nhận được kết quả như sau

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 

Điều gì làm cho trình kích hoạt của tôi không hợp lệ?

+1

Tôi đã gặp phải sự cố tương tự một lần. Vấn đề của tôi là do có nhiều hơn một kích hoạt với cùng một tên khác nhau chỉ trên vỏ. Tôi sẽ kiểm tra xem nó không phải là vấn đề bạn có. – Falle1234

+0

@ Falle1234 Tôi đã kiểm tra 'select * đó từ all_triggers'; không trùng lặp. –

+2

hãy cho chúng tôi biết lỗi thực tế là gì: 'hiển thị lỗi CDR.EXTDL_JOBSTATUS_SEQTRG' –

Trả lời

6

Cảnh báo: thực hiện hoàn thành với cảnh báo TRIGGER CDR.ExtDL_JobStatus_SeqTrg Biên soạn.

Đây là nơi trình biên dịch trình kích hoạt của bạn không thành công.

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 

Vấn đề là vì bạn đang sử dụng ExtDL_JobStatus_SeqTrg trong mã của bạn và trình tự mà bạn đã tạo là ExtDL_JobStatus_Seq.

Ngoài ra, nếu bạn đang cố gắng chạy tập lệnh như thế này để tạo (biên dịch) các đối tượng, tôi khuyên bạn nên thêm mệnh đề sau đây sau mỗi câu lệnh tạo/kích hoạt/hàm creatin.

SHOW ERRORS; 

Nếu tuyên bố của bạn thành công, điều đó sẽ không tạo ra lỗi. Nếu có bất kỳ lỗi nào, bạn sẽ có mô tả chi tiết về các lỗi thay vì phải thực thi lại tập lệnh.

+0

' SHOW ERRORS' hoạt động tốt - Cảm ơn bạn! –

2

Đó là một lỗi đánh máy đơn giản: trình tự của bạn được gọi là ExtDL_JobStatus_Seq nhưng trong trình kích hoạt của bạn, bạn tham chiếu ExtDL_JobStatus_SeqTrg.nextval.

Để tham khảo trong tương lai, bạn nên bao gồm lệnh gọi để hiển thị lỗi trong tập lệnh sau mỗi cuộc gọi biên dịch PL/SQL (trình kích hoạt, thủ tục, v.v.). Như thế này:

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 

Ngẫu nhiên, có cùng lỗi chính tả trong khối ẩn danh muốn bỏ chuỗi.

+0

tx để chỉ ra lỗi đánh máy bổ sung cũng như –

1

Ngoài tất cả những gì đã đề cập trước, có hai lỗi chính tả thêm/lỗi:

  1. Khối ẩn danh PL/SQL mà cố gắng để thả cò thực sự nói DROP SEQUENCE.
  2. Tuyên bố chèn cố gắng chèn chuỗi ký tự vào các cột Tên ngắn và Mô tả, cả hai đều được định nghĩa là NUMBER (38, 0).
+0

Tôi nhận thấy điều về các kiểu dữ liệu. Bằng cách nào đó mọi thứ đã thay đổi thành một miền - tôi đã đổi nó trở lại từng tên miền riêng lẻ –

Các vấn đề liên quan