2013-06-13 17 views
6

Ho bisogno di ottenere il riferimento di: new.OBJECT_VALUE ma non ora come.Oracle: ottenere riferimenti in PLSQL

Ho provato a farlo.

Dichiarazione di tipi:

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 di tabelle:

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

Dichiarazione di trigger:

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; 

Se qualcuno vuole provare con i dati:

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

ma ottengo l'errore successivo:

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

Qualcuno mi può aiutare?

+0

si trova all'interno di un trigger e sto triying per ottenere il riferimento di l'obiettivo di inserirlo in una tabella nidificata. –

+1

@Ben Vuole ottenere il puntatore logico all'oggetto riga. Vedi http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

Esattamente, grazie @Toru. –

risposta

1

Prova MAKE_REF:

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

L'opzione (s) per risolvere l'errore di Oracle sono:

OPZIONE # 1

Prova ridefinire il vostro tavolo in modo che nessuno dei vostri nomi di colonna sono riservati parole.

OPZIONE # 2

Prova che racchiude la parola riservata tra virgolette.

Ad esempio, se si ha una tabella fornitore con un numero di colonna di nome, e si è tentato di aggiornare questo campo come segue:

UPDATE suppliers SET number = 10000;