[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
  

Mensagemem Qua, 26 Mai 2004 6:55 pm

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!

Código: Selecionar todos
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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Sáb, 26 Mai 2012 9:41 am

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á.
abarbosa

Mensagemem Seg, 28 Mai 2012 9:09 am

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:
Código: Selecionar todos
SQL> set serveroutput on
SQL> DECLARE
  2     vtemp  NUMBER:=10;
  3  BEGIN
  4 
  5    DBMS_OUTPUT.PUT_LINE ( vtemp );
  6    --nao 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:
Código: Selecionar todos
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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para PL/SQL

Quem está online

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