2013-06-13 36 views
6

Tôi cần lấy tham chiếu về: new.OBJECT_VALUE nhưng bây giờ tôi không làm cách nào.Oracle: nhận tài liệu tham khảo trong PLSQL

Tôi đã thử làm điều này.

Tuyên bố của các loại:

CREATE TYPE Virus_ObjType AS OBJECT (
    name  VARCHAR2(50), 
    description VARCHAR2(700) 
); 
/

CREATE TYPE Paper_ObjType AS OBJECT (
    id   NUMBER, 
    title  VARCHAR(100), 
    magazine VARCHAR2(100), 
    vol  NUMBER, 
    num  NUMBER, 
    year  NUMBER(4) 
); 
/

CREATE TYPE Virus_NestTabType AS TABLE OF REF Virus_ObjType; 
/
CREATE TYPE Paper_NestTabType AS TABLE OF REF Paper_ObjType; 
/

ALTER TYPE Virus_ObjType ADD ATTRIBUTE papers Paper_NestTabType CASCADE; 
/
ALTER TYPE Paper_ObjType ADD ATTRIBUTE virus Virus_NestTabType CASCADE; 
/

Declatation của bảng:

CREATE TABLE Virus_ObjTable OF Virus_ObjType (
    PRIMARY KEY(name)) 
NESTED TABLE papers STORE AS papersVirus_NestTable; 

CREATE TABLE Paper_ObjTable OF Paper_ObjType (
    PRIMARY KEY (id)) 
NESTED TABLE virus STORE AS virus_NestTable; 

CREATE GLOBAL TEMPORARY TABLE virus_aux (
    type varchar2(1), 
    virus REF Virus_ObjType, 
    paper REF Paper_ObjType) 
ON COMMIT DELETE ROWS; 
/

Tuyên bố của cò:

create or replace 
trigger Virus_Trigger_Before BEFORE INSERT ON Virus_ObjTable 
FOR EACH ROW 
DECLARE 
    paper REF Paper_ObjType; 
    virus REF Virus_ObjType; 
BEGIN 
    IF inserting THEN 
     IF :new.papers IS NOT NULL THEN 
      FOR i IN 1..:new.papers.COUNT LOOP 
       -- getting the pointer of the papers 
       SELECT refe INTO paper 
        FROM (SELECT REF(a) as refe FROM Paper_ObjTable a) 
        WHERE refe=:new.papers(i); 

       SELECT REF(:NEW.OBJECT_ID) INTO virus FROM dual; 
       INSERT INTO virus_aux VALUES ('i', virus, paper); 
      END LOOP; 
     END IF; 
    END IF; 
END; 

Nếu ai đó muốn thử với dữ liệu:

INSERT INTO paper_objtable (id, title, magazine, vol, num, year) VALUES (1, 'Que mala es la Gripe', 'Fuzzy Sets', 1, 1, 1993); 
INSERT INTO paper_objtable (id, title, magazine, vol, num, year) VALUES (3, 'La Gripe ataca de nuevo', 'Information Sciences', 1, 1, 1996); 
INSERT INTO virus_objtable 
    (SELECT 'Gripe', 'Virus de la Gripe', CAST(COLLECT(REF(a)) AS Paper_NestTabType) 
    FROM paper_objtable a); 

nhưng tôi nhận được lỗi sau:

ORA-01747: invalid user.table.column, table.column, or columns specification 

bất cứ ai có thể giúp tôi?

+0

là bên trong một kích hoạt và tôi triying để có được những tài liệu tham khảo của các objet để chèn nó trong một bảng lồng nhau. –

+1

@Ben Ông muốn có được con trỏ logic đến đối tượng hàng. Xem http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

Chính xác, cảm ơn bạn @Toru. –

Trả lời

1

Hãy thử MAKE_REF:

SELECT MAKE_REF(virus_objtable, :new.object_id) INTO virus FROM dual; 
1

Tùy chọn (s) để khắc phục lỗi Oracle này là:

OPTION # 1

Cố gắng xác định lại bảng của bạn để không ai trong số các tên cột của bạn đều được bảo vệ từ ngữ.

TÙY CHỌN # 2

Thử kèm theo từ dành riêng trong dấu ngoặc kép.

Ví dụ, nếu bạn đã có một bảng cung cấp với một số cột được đặt tên, và bạn đã cố gắng để cập nhật lĩnh vực này như sau:

UPDATE suppliers SET number = 10000; 
Các vấn đề liên quan