sql >> Database >  >> RDS >> Oracle

Oracle REF kan niet doorgaan

U moet de tabel een alias geven en vervolgens naar de kolom verwijzen door:

<table_alias>.<ref_column>.<object_field>

SQL Fiddle

Oracle 11g R2 Schema-instellingen :

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

Query 1 :

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

Resultaten :

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



  1. JPA Qyery om records tussen een bereik te vinden

  2. Tabellen en indexen ouder dan 90 dagen automatisch laten vallen

  3. selecteer een waarde als deze bestaat, een andere indien niet

  4. Moet ik ontsnappen aan een verwachte integerwaarde met mysql_real_escape_string of kan ik gewoon (int)$expectedinteger gebruiken