2013-06-13 19 views
6

Potrzebuję uzyskać referencję: new.OBJECT_VALUE, ale nie wiem jak.Oracle: uzyskiwanie referencji w PLSQL

Próbowałem to zrobić.

Deklaracja typów:

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 tabel:

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; 
/

deklaracja wyzwalacza:

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; 

Jeśli ktoś chce spróbować z danymi:

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); 

ale pojawia się następny błąd:

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

Czy ktoś może mi pomóc?

+0

jest wewnątrz wyzwalacza i mam triying uzyskać referencję objet, aby wstawić go do zagnieżdżonego stołu. –

+1

@Ben Chce uzyskać logiczny wskaźnik do obiektu wiersza. Zobacz http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

Dokładnie, dziękuję @Toru. –

Odpowiedz

1

Spróbuj MAKE_REF:

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

Opcja (s), aby rozwiązać ten problem Oracle są:

OPCJA # 1

Spróbuj redefinicji tabelę tak, że żaden z nazwami kolumn są zarezerwowane słowa.

OPCJA # 2

Spróbuj załączając zastrzeżonego słowo w cudzysłów.

Na przykład, jeśli stolik dostawca z numerem kolumny nazwane, a próbowałeś zaktualizować to pole w następujący sposób:

UPDATE suppliers SET number = 10000; 
Powiązane problemy