2013-06-06 16 views
16

Tôi gặp phải lỗi lạ khi cố tạo trình kích hoạt trong cơ sở dữ liệu Oracle 11g của mình bằng cách sử dụng SQL Developer. Dưới đây là những gì tôi đã làm:Sự cố khi tạo trình kích hoạt trong Oracle 11g

bảng của tôi:

CREATE TABLE COUNTRY_CODE(
    ID NUMBER(19,0)  PRIMARY KEY NOT NULL, 
    Code    VARCHAR2(2) NOT NULL, 
    Description VARCHAR2(50), 
    created     TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    created_by     VARCHAR2(40) DEFAULT USER, 
    last_updated     TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    last_updated_by   VARCHAR2(40) DEFAULT USER, 
    archived CHAR(1) DEFAULT '0' NOT NULL); 

Các trình tự:

CREATE SEQUENCE COUNTRY_CODE_ID_SEQ START WITH 1 INCREMENT BY 1; 

Trigger:

CREATE OR REPLACE TRIGGER COUNTRY_CODE_TRIGGER 
BEFORE INSERT ON COUNTRY_CODE 
FOR EACH ROW 
DECLARE 
    max_id number; 
    cur_seq number; 
BEGIN 
    IF :new.id IS NULL THEN 
    SELECT COUNTRY_CODE_ID_SEQ.nextval 
    INTO :new.id 
    FROM dual; 
ELSE 
    SELECT GREATEST(NVL(MAX(id),0), :new.id) 
    INTO max_id 
    FROM COUNTRY_CODE; 

    SELECT COUNTRY_CODE_ID_SEQ.nextval 
    INTO cur_seq 
    FROM dual; 

    WHILE cur_seq < max_id 
    LOOP 
     SELECT COUNTRY_CODE_ID_SEQ.nextval 
     INTO cur_seq 
     FROM dual; 
    END LOOP; 
END IF; 
END; 

Tạo bảng và trình tự hoạt động rất tốt, nhưng khi tôi cố gắng tạo trình kích hoạt của mình, tôi nhận được lỗi này:

Error report: 
ORA-00603: ORACLE server session terminated by fatal error 
ORA-00600: internal error code, arguments: [kqlidchg0], [], [], [], [], [], [], [], [], [], [], [] 
ORA-00604: error occurred at recursive SQL level 1 
ORA-00001: unique constraint (SYS.I_PLSCOPE_SIG_IDENTIFIER$) violated 
00603. 00000 - "ORACLE server session terminated by fatal error" 
*Cause: An ORACLE server session is in an unrecoverable state. 
*Action: Login to ORACLE again so a new server session will be created 

Có ai biết về lỗi này không?

Cảm ơn

+0

Khi bạn khắc phục vấn đề PLScope, bạn sẽ nhận được một mutating kích hoạt ngoại lệ. Trình kích hoạt cấp hàng trên 'COUNTRY_CODE' không được phép truy vấn bảng' COUNTRY_CODE'.Mặc dù có thể giải quyết vấn đề này với trình kích hoạt cấp tuyên bố bổ sung, nhưng dường như bạn không cần phải kiểm tra mỗi lần một hàng được chèn vào xem chuỗi có cần được đặt lại hay không. Dường như nhiều khả năng bạn chỉ muốn đặt chuỗi thành giá trị lớn hơn trong những dịp hiếm hoi đó là nguyên nhân gây ra tình trạng lỗi này. –

Trả lời

39

cuối cùng tôi đã tìm thấy câu trả lời cho vấn đề của tôi:

Thêm này:

ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE'; 

Hoặc trong Oracle SQL Developer:

  1. Đi tới Công cụ | Tùy chọn
  2. Chọn Cơ sở dữ liệu | PL/SQL biên dịch
  3. Thay đổi định danh PLScope từ Tất cả đến Không
  4. Bấm vào Ok

này sửa chữa vấn đề này ...

+0

Điều đó đã khắc phục được sự cố của tôi. Nhưng tại sao nó lại xảy ra? Điều gì thực sự là vấn đề? – Dariusz

3

Có thể có một giải pháp cho điều này here.

+0

Cảm ơn Tony, tôi đánh giá cao nó! –

+0

@TonyAndrews Cố gắng tránh câu trả lời chỉ với siêu liên kết. Nếu liên kết bị hỏng, câu trả lời này sẽ trở thành vô dụng. Bạn có thể muốn sửa đổi câu trả lời của mình để đăng một bản tóm tắt về những gì bạn đã học và sau đó tham khảo liên kết. – vapcguy

+0

@vapcguy Điểm được lấy, tuy nhiên câu trả lời này là 3 tuổi và không phải là câu trả lời được chấp nhận tôi có lẽ sẽ không! –

2

Tôi không có giải pháp khác (và không có danh tiếng chỉ đơn thuần là bình luận), nhưng đây là một số thông tin có thể giúp một người nào đó đi đúng hướng để giải quyết vấn đề này trong khi vẫn sử dụng PL/Phạm vi.

Tôi vừa gặp vấn đề tương tự, và nhìn vào tính năng PL/Scope đã giúp tôi hiểu được vấn đề có thể xảy ra. Đối với vấn đề của tôi, tôi đã cố gắng tạo trình kích hoạt và lỗi chính xác xuất hiện. Tôi đã thay đổi cơ thể của kích hoạt để không có kết quả, nhưng thay đổi tên làm việc tốt.

Dường như PL/Scope đang nắm giữ thông tin về trình kích hoạt khởi tạo đầu tiên, trước khi thả nó. Truy vấn trên trình kích hoạt cho thấy trình kích hoạt của tôi chắc chắn đã bị xóa, nhưng truy vấn trên các định danh (PL/Scope) ("all_identifiers") cho thấy nó vẫn còn ở đó.

Một số thông tin về PL/Phạm vi là ở đây: http://www.oracle.com/technetwork/testcontent/o67asktom-101004.html

Chương 8 đây (tài liệu 11g) có thêm thông tin: http://docs.oracle.com/cd/B28359_01/appdev.111/b28424.pdf