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.