Então, um bloco aninhado quando não tem declaração de variáveis, serve mais pra controlar exceptions para aquele bloco.
O valor das variáveis definidos fora do bloco, são validos e podem ser manipulados normalmente dentro do bloco.
Exemplo:
Selecionar tudo
SQL> set serveroutput on
SQL> DECLARE
2 vtemp NUMBER:=10;
3 BEGIN
4
5 DBMS_OUTPUT.PUT_LINE ( vtemp );
6 --não tem outra declaracao!
7 BEGIN
8 DBMS_OUTPUT.PUT_LINE ( vtemp );
9 vtemp := 20;
10 --aqui vai um select...
11 EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
12 END;
13 DBMS_OUTPUT.PUT_LINE ( vtemp );
14 END;
15 /
10
10
20
PL/SQL procedure successfully completed
SQL>
Tem esse outro exemplo, quando temos uma declaração dentro da outra. CASO sejam nomes de variáveis diferentes, é a mesma coisa. A única diferença e que a variável declarada dentro do bloco de dentro só existe dentro daquele bloco! Aqui vai a prova:
Selecionar tudo
SQL> DECLARE
2 vtemp NUMBER:=10;
3 BEGIN
4 DECLARE outra NUMBER:=20;
5 BEGIN
6 DBMS_OUTPUT.PUT_LINE ( outra );
7 END;
8
9 DBMS_OUTPUT.PUT_LINE ( outra ); --citando fora do seu bloco!
10 END;
11 /
DECLARE
vtemp NUMBER:=10;
BEGIN
DECLARE outra NUMBER:=20;
BEGIN
DBMS_OUTPUT.PUT_LINE ( outra );
END;
DBMS_OUTPUT.PUT_LINE ( outra ); --citando fora do seu bloco!
END;
ORA-06550: line 9, column 26:
PLS-00201: identifier 'OUTRA' must be declared
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored
SQL>
Veja que ao citar a variavel OUTRA fora do seu bloco, ela não existe!
E ainda temos aquele exemplo lá de cima, onde é declarado duas variáveis com o MESMO nome, daí o valor da segunda só existe dentro do seu bloco.