2013-06-13 21 views
6

Ich brauche die Referenz von: new.OBJECT_VALUE, aber ich weiß nicht, wie.Oracle: Erhalten von Referenzen in PLSQL

Ich habe versucht, dies zu tun.

Erklärung Typen:

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 von Tabellen:

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

Erklärung Auslöser:

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; 

Wenn jemand mit Daten versuchen will:

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

aber ich bekomme den nächsten Fehler:

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

Kann mir jemand helfen?

+0

ist innerhalb eines Triggers und ich bin triying die Referenz zu erhalten das Objekt, um es in eine geschachtelte Tabelle einzufügen. –

+1

@Ben Er möchte den logischen Zeiger auf das Zeilenobjekt erhalten. Siehe http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

Genau, danke @Toru. –

Antwort

1

Versuchen MAKE_REF:

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

Die Option (en) dieses Oracle Fehler zu beheben sind:

OPTION # 1

Versuchen Sie Tabelle neu zu definieren, so dass keine Ihrer Spaltennamen sind reserviert Wörter.

OPTION # 2

Versuchen Sie das reservierte Wort in Anführungszeichen eingeschlossen wird.

Zum Beispiel, wenn Sie einen Lieferanten Tabelle mit einer Spalte namens Nummer hatte, und man versucht, dieses Feld zu aktualisieren, wie folgt:

UPDATE suppliers SET number = 10000;