Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle REF nie może przejść

Musisz nadać tabeli alias, a następnie odwołać się do kolumny:

<table_alias>.<ref_column>.<object_field>

Skrzypce SQL

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

Zapytanie 1 :

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

Wyniki :

| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powiadomienie o zmianie bazy danych JPA Eclipselink nie unieważnia wpisu w pamięci podręcznej

  2. Zaktualizuj kolumnę przy użyciu losowych unikalnych wartości z innej tabeli

  3. Szacowanie czasu utworzenia indeksu w Oracle

  4. Jak zmienić format daty w sesji Oracle

  5. Łączenie się z bazą danych Oracle 12c z Pentaho Data Integration (Kettle) Community Edition