2013-06-13 36 views
6

referanslarını aldığım için şu referansı almalıyım: new.OBJECT_VALUE ama şimdi nasıl yapmıyorum.Oracle: PLSQL

Bunu yapmayı denedim. türlerinden

Beyanı:

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

tablo Declatation: tetik

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

Beyanı:

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; 

birisi verilerle denemek istiyorsa:

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

ama sonraki hata alıyorum:

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

kimse bana yardımcı olabilir misiniz?

+0

bir tetikleyici içinde mi ve referansını almak için triying ediyorum: Bir sütun adında sayı ile bir tedarikçi tablo vardı ve eğer aşağıdaki gibi

Örneğin, bu alanı güncellemek için çalıştı iç içe bir tabloya yerleştirmek için objet. –

+1

@Ben Satır nesnesine mantıksal işaretçiyi almak istiyor. Bkz. Http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#i458258 – Toru

+0

Tam olarak, teşekkürler @Toru. –

cevap

1

MAKE_REF deneyin:

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

seçeneği (ler) bu Oracle hatayı çözmek için vardır:

SEÇENEĞİ 1.

tablonuzu yeniden tanımlanması deneyin sütun adlarının hiçbiri saklıdır böylece kelimeler.

SEÇENEĞİ # 2

çift tırnak amaçlı sözcüğünü çevreleyen deneyin.

UPDATE suppliers SET number = 10000;