[Dica] Escopo de variáveis

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Vejam que interessante isso:
Criei 2 blocos (um dentro do outro) declarando a MESMA variável. Descobri que o Oracle funciona igual o Java em matéria de "escopo" de variáveis: as variáveis obedecem o valor do seu escopo!

Selecionar tudo

DECLARE VTEMP NUMBER:=5;
BEGIN
  DBMS_OUTPUT.PUT_LINE(VTEMP);

  DECLARE VTEMP NUMBER:=10;
  BEGIN
    DBMS_OUTPUT.PUT_LINE(VTEMP);
  END;

  DBMS_OUTPUT.PUT_LINE(VTEMP);
END;
/

5
10
5
 
PL/SQL procedure successfully completed.
abarbosa
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 24 Mai 2012 10:11 pm

Po super bacana.
Poderia detalhar como funciona esses blocos aninhados?
No delphi usava muito isso,mas no plsql fico meio com duvida da utilização dele.

Agradçeo desde já.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 15 visitantes