Oracle REF无法通过

时间:2013-11-27 23:03:44

标签: sql oracle

我的桌子:

create or replace type t_exemplaire as object  
( IdExemplaire     Number(10),  
  NumeroRayon      Number(5),  
  Document     ref t_document )  

/

create table exemplaire of t_exemplaire(   
    primary key(IdExemplaire),  
    constraint Document_c CHECK ( Document is not null)) 

/

create or replace type t_emprunt as object  
( IdEmprunt         Number(10),  
  DateD             DATE,    
  DateF             DATE,  
  Emprunteur_ref    ref t_emprunteur,  
  Exemplaire_ref    ref t_exemplaire )

/

create table emprunt of t_emprunt(  
    primary key(IdEmprunt),  
    Emprunteur_ref scope is emprunteur,  
    Exemplaire_ref scope is exemplaire,  
    DateD default sysdate)    

/

我想访问我的属性类型:

Exemplaire_ref.IdExemplaire

但我收到了很多错误。

如何使用REF访问属性?

DEREF不起作用,我使用oracle XE 11

谢谢

1 个答案:

答案 0 :(得分:1)

您需要为表提供别名,然后通过以下方式引用该列:

<table_alias>.<ref_column>.<object_field>

SQL Fiddle

Oracle 11g R2架构设置

create or replace type t_document as object  
( IdDocument     Number(10) )  
/

create table document of t_document(   
    primary key(IdDocument)) 
/

INSERT INTO document 
          SELECT t_document( 1 ) FROM DUAL
UNION ALL SELECT t_document( 2 ) FROM DUAL
/

create or replace type t_emprunteur as object  
( IdEmprunteur     Number(10) )  
/

create table emprunteur of t_emprunteur(   
    primary key(IdEmprunteur)) 
/

INSERT INTO emprunteur 
          SELECT t_emprunteur( 1 ) FROM DUAL
UNION ALL SELECT t_emprunteur( 2 ) FROM DUAL
/

create or replace type t_exemplaire as object  
( IdExemplaire     Number(10),  
  NumeroRayon      Number(5),  
  Document         ref t_document )  
/

create table exemplaire of t_exemplaire(   
    primary key(IdExemplaire),  
    constraint Document_c CHECK ( Document is not null)) 

/

INSERT INTO exemplaire
          SELECT t_exemplaire( 1, 13, (SELECT REF(d) FROM document d WHERE d.IdDocument = 2) ) FROM DUAL
UNION ALL SELECT t_exemplaire( 2, 42, (SELECT REF(d) FROM document d WHERE d.IdDocument = 1) ) FROM DUAL
/

create or replace type t_emprunt as object  
( IdEmprunt         Number(10),  
  DateD             DATE,    
  DateF             DATE,  
  Emprunteur_ref    ref t_emprunteur,  
  Exemplaire_ref    ref t_exemplaire )

/

create table emprunt of t_emprunt(  
    primary key(IdEmprunt),  
    Emprunteur_ref scope is emprunteur,  
    Exemplaire_ref scope is exemplaire,  
    DateD default sysdate)    
/

INSERT INTO emprunt
          SELECT t_emprunt( 1,
                            SYSDATE,
                            SYSDATE - 1,
                            (SELECT REF(e) FROM emprunteur e WHERE e.IdEmprunteur = 1),
                            (SELECT REF(e) FROM exemplaire e WHERE e.IdExemplaire = 2)
                          ) FROM DUAL
UNION ALL SELECT t_emprunt( 2,
                            TO_DATE( '2000/01/01', 'YYYY/MM/DD' ),
                            TO_DATE( '2001/12/31', 'YYYY/MM/DD' ),
                            (SELECT REF(e) FROM emprunteur e WHERE e.IdEmprunteur = 2),
                            (SELECT REF(e) FROM exemplaire e WHERE e.IdExemplaire = 1)
                          ) FROM DUAL
/

CREATE INDEX emprunt_emprunteur_ref_idx ON emprunt (Emprunteur_ref)
/

查询1

SELECT e.IdEmprunt,
       e.Emprunteur_ref.IdEmprunteur,
       e.Exemplaire_ref.IdExemplaire,
       e.Exemplaire_ref.NumeroRayon,
       e.Exemplaire_ref.Document.IdDocument
FROM   emprunt e

<强> Results

| IDEMPRUNT | EMPRUNTEUR_REF.IDEMPRUNTEUR | EXEMPLAIRE_REF.IDEXEMPLAIRE | EXEMPLAIRE_REF.NUMERORAYON | EXEMPLAIRE_REF.DOCUMENT.IDDOCUMENT |
|-----------|-----------------------------|-----------------------------|----------------------------|------------------------------------|
|         1 |                           1 |                           2 |                         42 |                                  1 |
|         2 |                           2 |                           1 |                         13 |                                  2 |