Escopo variável PL/SQL e bloco interno externo: estrutura aninhada
⚡ Resumo Inteligente
Em PL/SQL, os blocos aninhados colocam um bloco dentro de outro, permitindo separar lógicas complexas e isolar o tratamento de exceções. Compreender o escopo das variáveis entre os blocos externos e internos, e usar rótulos de bloco, mantém as variáveis com o mesmo nome sem ambiguidade.

O que são blocos aninhados Oracle?
In PL/SQLCada bloco pode ser aninhado dentro de outro bloco. Tal bloco é chamado de bloco aninhado. Blocos aninhados são muito comuns quando você deseja executar um determinado processo enquanto mantém o restante do bloco aninhado.ping O código para esse processo em um contêiner (bloco) separado.
O conceito de blocos aninhados ajuda o programador a melhorar a legibilidade, separando a lógica complexa em blocos individuais, e permite que exceção para cada bloco a ser tratado dentro do bloco externo principal.
Estrutura de bloco aninhado
Um bloco pode ser aninhado dentro de outro bloco. Ele pode ser aninhado tanto na parte de execução quanto na parte de tratamento de exceções, e esses blocos também podem ser rotulados. Um bloco externo pode conter vários blocos internos. Cada bloco interno é, por sua vez, um bloco externo. Bloco PL/SQLAssim, todas as propriedades e características do bloco interno são as mesmas do bloco externo. O bloco pai é o bloco principal e o bloco filho é o bloco aninhado.
A imagem abaixo fornece uma representação pictórica da estrutura de blocos aninhados, na qual o bloco pai é o bloco principal e o bloco filho é o bloco aninhado.
A seguir, apresentamos a sintaxe do bloco aninhado. A captura de tela abaixo mostra a sintaxe do bloco aninhado com seus blocos externo e interno identificados.
Sintaxe de bloco aninhado
<<outer_block>> DECLARE <Declarative section> BEGIN <Execution part for outer block begins> <<inner block>> DECLARE <Declarative section> BEGIN <Execution part for inner block>. EXCEPTION <Exception handling part> END; <Execution part for outer block begins> EXCEPTION <Exception handling part> END;
- A sintaxe acima mostra o bloco aninhado que contém um total de dois blocos.
- Esses blocos são denominados 'bloco_externo' e 'bloco_interno'.
Escopos em bloco aninhado: escopo variável
Em um bloco aninhado, é fundamental compreender claramente o escopo e a visibilidade de cada bloco antes de utilizá-los. Particularmente no bloco interno, elementos tanto do bloco externo quanto do interno ficam visíveis, portanto, um entendimento adequado disso é essencial.
Os pontos abaixo resumem os escopos em blocos aninhados.
- Os elementos declarados no bloco externo, e o valor definido antes da definição do bloco interno, são visíveis dentro do bloco interno.
- Os elementos declarados no bloco interno não são visíveis no bloco externo. Eles são visíveis apenas dentro do bloco interno.
- O bloco externo e o bloco interno podem ter um variável com o mesmo nome.
- No caso de variáveis com o mesmo nome, o bloco interno, por padrão, refere-se apenas à variável declarada dentro do próprio bloco interno.
- Se o bloco interno quiser se referir à variável do bloco externo que tem o mesmo nome que a variável do bloco interno, então o bloco externo deve ser LABELADO e a variável do bloco externo pode ser referida como ' . '.
O exemplo abaixo ajuda você a entender melhor esses escopos.
1 exemplo: Neste exemplo, vemos o escopo das variáveis nos blocos interno e externo. Também vemos como nos referir às variáveis usando um rótulo de bloco.
A captura de tela abaixo mostra o Exemplo 1, onde o bloco interno se refere a uma variável de bloco externo usando o rótulo do bloco.
<<OUTER_BLOCK>> DECLARE var1 VARCHAR2(30):='outer_block'; var2 VARCHAR2(30):='value before inner block'; BEGIN <<INNER_BLOCK>> DECLARE var1 VARCHAR2(30):='inner_block'; BEGIN dbms_output.put_line(var1); dbms_output.put_line(OUTER_BLOCK.var1); dbms_output.put_line(var2); END; var2:='value after inner block'; END; /
Code Explicação:
- Code linha 1: Rotule o bloco externo como “OUTER_BLOCK”.
- Code linha 3: Declarando uma variável 'var1' como VARCHAR2 (30) com o valor inicial de “outer_block”.
- Code linha 4: Declarando uma variável 'var2' como VARCHAR2 (30) com o valor inicial de “valor antes do bloco interno”.
- Code linha 6: Rotule o bloco interno como “INNER_BLOCK”.
- Code linha 8: Declarando uma variável 'var1' no bloco interno como VARCHAR2 (30) com o valor inicial de “inner_block”.
- Code linha 10: Imprimindo o valor de 'var1'. Como nenhum rótulo foi mencionado, por padrão, ele pega o valor do bloco interno, daí a impressão da mensagem 'bloco_interno'.
- Code linha 11: Imprimindo o valor da variável 'var1' do bloco externo. Como o bloco interno possui uma variável com o mesmo nome, fazemos referência ao rótulo do bloco externo. Portanto, imprime a mensagem 'outer_block'.
- Code linha 12: Imprimindo o valor da variável 'var2' do bloco externo. Como não existe uma variável com esse nome no bloco interno, por padrão, o valor é obtido do bloco externo, daí a mensagem 'valor antes do bloco interno'.
- A variável 'var2' no bloco externo recebe o valor 'valor após o bloco interno'. Mas essa atribuição ocorre depois da definição do bloco interno, portanto esse valor não está presente dentro do bloco interno.
2 exemplo: Neste exemplo, encontramos a diferença entre dois números, um declarado no bloco externo e outro no bloco interno. Ambos têm o mesmo nome. Vejamos como o rótulo do bloco é útil para nos referirmos a essas variáveis.
A captura de tela abaixo mostra o Exemplo 2, que calcula a diferença entre as variáveis de bloco externo e interno com o mesmo nome.
<<OUTER_BLOCK>> DECLARE ln_val NUMBER :=5; BEGIN <<INNER_BLOCK>> DECLARE ln_val NUMBER :=3; BEGIN dbms_output.put_line('The difference between outer block and inner block variable is:'||outer_block.ln_val-inner_block.ln_val); END; END; /
Code Explicação:
- Code linha 1: Rotule o bloco externo como “OUTER_BLOCK”.
- Code linha 3: Declarando uma variável 'ln_val' como NUMBER com o valor inicial de “5”.
- Code linha 5: Rotule o bloco interno como “INNER_BLOCK”.
- Code linha 7: Declarando uma variável 'ln_val' no bloco interno como NUMBER com o valor inicial de “3”.
- Code linha 9: Imprimindo a diferença no valor de 'ln_val' entre o bloco externo e o interno. O “ . O formato “" é usado para se referir a essas variáveis para evitar conflitos devido ao mesmo nome de variável.




