2015-06-04 7 views
9

Ieri mi sono imbattuto in qualche strano comportamento su un'istanza Oracle 10g clienti. Qualche procedura che ho scritto mi ha dato un'eccezione invalid identifier, ma andava bene sulle mie istanze Oracle 11g.Nome alias doppio/casuale nella clausola select su Oracle 11g non genera un'eccezione di identificatore non valida

La query rilevante era qualcosa di simile al seguente:

select b.b.v_col_b 
from tbla a 
left join tblb b on a.pk_col_a = b.fk_a; 

Motivi di notare la parte b.b.v_col_b della query. Cambiare left join-inner join ha finalmente sollevare un'eccezione ORA-00904: "B"."B"."V_COL_B": invalid identifier, ma:

  1. Non è presente un errore di sintassi?
  2. Qualcuno può spiegare questo comportamento?

Una demo di lavoro può essere trovato sulla sqlfiddle

Edit: Aggiunta la definizione della tabella:

create table tbla (
    pk_col_a int primary key, 
    v_col_a varchar2(50)); 

create table tblb (
    pk_col_b int primary key, 
    fk_a int, 
    v_col_b varchar2(50)); 

Edit2: Come @ LalitKumarB ha parlato di questo sembra accadere solo su Oracle 11g

+0

Seleziona anche: 'selezionare k.b.v_col_b da TBLA un LEFT JOIN tblb b sul a.pk_col_a = b.fk_a;' Strano –

+0

Così avete una colonna chiamata 'b.v_col_b'? – Arion

+0

@Arion, no, guarda il violino ... –

risposta

0

ORA-00904: "B". "B". "V_COL_B": identificatore non valido

In SQL il identificatore qualificato XYZ si riferisce ad un sistema X, Y tavolo, e la colonna Z. considerando un semplice YZ mezzi tavola Y, Z. colonna

E quindi chiamando un identificatore XYZ potrebbe essere fuorviante troppo, ma non troppo irregolare in informatica.

Sul comportamento dell'errore che hai provato non posso dire molto.

1

Congratulazioni, hai trovato un bug :)

In questo caso particolare, si può scrivere quello che vuoi quando si seleziona una delle colonne tblb:

select helloworld.b.v_col_b, mghjfghj.b.fk_a, asdasdas.b.pk_col_b 
from tbla a 
left join tblb b on a.pk_col_a = b.fk_a; 

Si può anche farlo con una right join:

select helloworld.b.v_col_b, mghjfghj.b.fk_a, asdasdas.b.pk_col_b 
from tblb b 
right join tbla a on a.pk_col_a = b.fk_a; 

Tuttavia, non funziona con la sintassi di join Oracle ((+) notazione).

Non è un comportamento previsto e, come indicato da Lalit nei commenti, è fissato in 12C. Se lo desideri, puoi inviare una richiesta di bug con il Supporto Oracle. Forse c'è già una patch per questo.