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.

  • 🧱 Bloco aninhado: Um bloco aninhado é um bloco PL/SQL colocado dentro da seção de execução ou de exceção de outro bloco.
  • ???? Exterior e Interior: Um bloco externo, ou bloco pai, pode conter vários blocos internos, ou blocos filhos, cada um deles um bloco PL/SQL completo.
  • 👁️ Escopo da variável: Variáveis ​​de bloco externo declaradas antes de um bloco interno são visíveis dentro dele, mas variáveis ​​de bloco interno não são visíveis fora dele.
  • 🏷️ Rótulos de bloco: Ao rotular o bloco externo, o bloco interno pode fazer referência a uma variável externa com o mesmo nome, como em `label.variable_name`.
  • 🛡️ Isolamento de exceções: O aninhamento permite que cada bloco lide com suas próprias exceções, mantendo-asping O tratamento de erros deve ser feito próximo ao código que os gera.
  • 🤖 Assistência de IA: Assistentes de IA, como o GitHub Copilot, rotularam rascunhos de blocos aninhados e sinalizaram conflitos de escopo de variáveis.

Escopo de variáveis ​​PL/SQL em blocos internos e externos aninhados

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.

Representação pictórica de um bloco aninhado PL/SQL com um bloco externo pai e um bloco interno filho.

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 blocos aninhados mostrando blocos externos e internos rotulados, cada um com seções DECLARE, BEGIN e EXCEPTION.

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.

Exemplo de escopo de variável em blocos aninhados, referindo-se a uma variável de bloco externo pelo seu rótulo de 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.

Exemplo de cálculo da diferença entre variáveis ​​de bloco externas e internas com o mesmo nome, usando rótulos de bloco.

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

Perguntas Frequentes

Um bloco aninhado é um bloco anônimo colocado dentro de outro bloco e executado em linha no local onde aparece. subprograma (Procedimento ou função) é uma unidade nomeada e reutilizável que é armazenada separadamente e chamada por nome, opcionalmente com parâmetros.

Cada bloco pode ter sua própria seção de EXCEÇÕES. Uma exceção lançada no bloco interno é tratada primeiro por esse bloco; se não for tratada, ela se propaga para o manipulador do bloco externo que a contém. Isso permite isolar o tratamento de erros por bloco.

PL/SQL não impõe um limite fixo pequeno, portanto os blocos podem ser aninhados em vários níveis de profundidade. Na prática, o aninhamento profundo prejudica a legibilidade, então a maioria dos códigos limita o aninhamento a dois ou três níveis e move a lógica reutilizável para subprogramas.

Um rótulo de bloco, escrito como um nome entre colchetes angulares duplos antes de DECLARE, nomeia um bloco. Os rótulos permitem que o código interno qualifique uma variável externa como rótulo.nome_da_variável e também podem servir como destinos GOTO, tornando o código aninhado mais fácil de ler e documentar.

Sim. Um bloco aninhado pode aparecer em qualquer lugar onde uma instrução executável seja permitida, incluindo dentro de um loop, um ramo IF ou o corpo de um procedimento. Isso permite que você limite as declarações e o tratamento de exceções apenas à parte do código que precisa deles.

O aninhamento é principalmente uma ferramenta de estruturação em tempo de compilação e, por si só, não adiciona sobrecarga significativa em tempo de execução. Ele melhora a legibilidade e o isolamento de erros. O aninhamento excessivo geralmente prejudica a manutenção, e não a velocidade bruta.

Sim. Travas deslizantes portáteis Copiloto do GitHub Rascunhos rotulados como blocos externos e internos, incluindo as seções DECLARE, BEGIN e EXCEPTION, a partir de um comentário. RevVeja os rótulos dos blocos e o escopo das variáveis ​​para que as variáveis ​​internas e externas com o mesmo nome sejam resolvidas conforme o esperado.

Assistentes de IA analisam blocos aninhados e sinalizam variáveis ​​ocultas, referências não qualificadas e acessos fora do escopo. Essa revisão por aprendizado de máquina destaca locais onde um bloco interno usa silenciosamente a variável de mesmo nome incorretamente antes da execução do código.

Resuma esta postagem com: