Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Nome da coluna SQL igual ao nome da variável PL/SQL - Como isso pode ser feito em uma instrução select?


Você pode, se for liberal o suficiente em sua definição de "sem a necessidade de alterar os nomes das variáveis" . Lendo o fabuloso PL/SQL Name Resolution diz:

Se um identificador for declarado em uma unidade PL/SQL nomeada, você pode qualificar seu nome simples (o nome em sua declaração) com o nome da unidade (bloco, subprograma ou pacote), usando esta sintaxe:

unit_name.simple_identifier_name

O exemplo a seguir imprimirá 20 como esperado:
create table foo (a number, b number);

insert into foo values(1, 10);
insert into foo values(2, 20);
insert into foo values(3, 30);

begin
  <<bar>>
  declare
    a number;
    b number;
  begin
    a := 2;
    select b into bar.b from foo where a = bar.a;
    dbms_output.put_line(b);
  end;
end;
/

Os nomes das variáveis ​​não são alterados. Em vez disso, eles são hmm ... mais qualificados :)

Observe que o seguinte não funciona:
begin
  declare
    a number;
    b number;
  begin
    a := 2;
    select foo.b into b from foo where foo.a = a;
    dbms_output.put_line(b);
  end;
end;
/

Como o a não qualificado no select -statement é interpretado como uma coluna devido às regras de precedência:

Se uma instrução SQL fizer referência a um nome que pertence a uma coluna e a uma variável local ou a um parâmetro formal, o nome da coluna terá precedência.