Oracle REF无法通过 [英] Oracle REF can't go through

查看:75
本文介绍了Oracle REF无法通过的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的桌子:

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)    

/

我想要访问这样的属性类型:

I would like access to my attribute type like that :

Exemplaire_ref.IdExemplaire

但是我遇到很多错误.

如何使用REF访问属性?

How can I use REF to access attributes ?

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

DEREF do not work , I use oracle XE 11

谢谢

推荐答案

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

You need to give the table an alias and then refer to the column by:

<table_alias>.<ref_column>.<object_field>

SQL提琴

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 |

这篇关于Oracle REF无法通过的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆