2013-06-13 2 views
6

new.OBJECT_VALUE 참조를 가져와야하지만 지금은 어떻게해야합니까?오라클 : PLSQL에서 참조 얻기

나는 이것을 시도했다. 유형의

선언 :

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 : 트리거의

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

선언 :

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; 

사람이 데이터를 시도하고자하는 경우

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); 
01 23,516,

하지만 난 다음 오류가 발생합니다 :

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

이 사람이 나를 도울 수 있습니까?

+0

트리거의 내부 내가의 참조를 가져 triying 해요 : 당신이 열 이름을 수있는 공급 업체 테이블이 있고, 경우에 다음과 같이

예를 들어,이 필드를 업데이트하려고 objet를 중첩 테이블에 삽입합니다. –

+1

@Ben 그는 행 객체에 대한 논리적 포인터를 얻고 싶습니다. http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

을 참조하십시오. 정확히 @ 토루. 고맙습니다. –

답변

1

MAKE_REF보십시오 :

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

옵션 (들)은 오라클 오류를 해결하려면이 있습니다 :

옵션 # 1

하는 테이블을 다시 정의하십시오 당신의 열 이름 중 어느 것도 소유하지 않도록 말.

옵션 2

예약어를 큰 따옴표로 묶으십시오.

UPDATE suppliers SET number = 10000; 
관련 문제