Escopo variável PL/SQL e bloco interno externo: estrutura aninhada
O que são blocos aninhados Oracle?
Em PL/SQL, cada bloco pode ser aninhado em outro bloco. Eles são chamados de blocos aninhados. Blocos aninhados são muito comuns quando queremos realizar determinado processo e, ao mesmo tempo, o código desses processos deve ser mantido em um contêiner (bloco) separado.
O conceito de bloco aninhado ajudará o programador a melhorar a legibilidade, separando as coisas complexas em cada bloco e a lidar com a exceção de cada bloco dentro do bloco externo principal.
Estrutura de bloco aninhado
Um bloco pode ser aninhado em outro bloco. Isso pode ser aninhado na parte de execução ou na parte manipulação de exceção papel. Esses blocos também podem ser rotulados. Um bloco externo pode conter muitos blocos internos. Cada bloco interno é mais uma vez um Bloco PL/SQL, portanto, todas as propriedades e características do bloco interno serão iguais às do bloco externo. A imagem abaixo fornece a representação pictórica da estrutura de blocos aninhados. O bloco pai é o bloco principal e o bloco filho é o bloco aninhado.
Abaixo está a sintaxe do bloco aninhado.
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 rotulados como 'outer_block' e 'inner_block'
Escopos em bloco aninhado: escopo variável
Em blocos aninhados, é necessário entender claramente o escopo e a visibilidade de cada bloco antes de usá-los. Particularmente no bloco interno, os elementos do bloco externo e interno serão visíveis. Portanto, é necessária uma compreensão adequada disso.
Os pontos abaixo resumirão mais sobre 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 uma variável com o mesmo nome.
- No caso de variáveis com o mesmo nome, o bloco interno por padrão se referirá apenas à variável declarada no bloco interno.
- Se o bloco interno quiser se referir à variável do bloco externo que tem o mesmo nome do bloco interno, então o bloco externo deve ser LABELLED, e a variável do bloco externo pode ser referida como ' . '
O exemplo abaixo ajudará a entender mais sobre esses escopos.
Exemplo 1: Neste exemplo, veremos o escopo das variáveis no bloco interno e externo. Além disso, veremos como referir as variáveis usando o rótulo do bloco.
<<OUTER_BLOC>> DECLARE varl VARCHAR2(30):='outer_block'; var2 VARCHAR2(30):='value before inner block’; BEGIN <<NNER_BLOCK>> DECLARE varl VARCHAR2(30):='inner_block'; BEGIN dbms_output.put_line(varl), dbms_output.put_line(OUTER_BLOCKvar1); dbms_output.put_line(var2); END; var2:='value after inner block'; END; /
Explicação do código:
- Linha de código 1: Rotulando o bloco externo como “OUTER_BLOCK”.
- Linha de código 3: Declarando uma variável 'var1' como VARCHAR2 (30) com o valor inicial de “bloco externo”.
- Linha de código 4: Declarando uma variável 'var2' como VARCHAR2 (30) com o valor inicial de “valor antes do bloco interno”.
- Linha de código 6: Rotulando o bloco interno como “INNER_BLOCK”
- Linha de código 8: Declarar uma variável 'var1' no bloco interno como VARCHAR2 (30) com o valor inicial de “bloco interno”.
- Linha de código 10: Imprimindo o valor de 'var1'. Como nenhum rótulo é mencionado por padrão, ele pegará o valor de um bloco interno, imprimindo assim a mensagem 'inner_block'.
- Linha de código 11: Imprimindo o valor da variável do bloco externo 'var1'. Como o bloco interno possui a variável com o mesmo nome, precisamos nos referir ao rótulo do bloco externo. Imprimindo assim a mensagem 'bloco externo'.
- Linha de código 12: Imprimindo o valor da variável do bloco externo 'var2'. Como não existe nenhuma variável com este nome presente no bloco interno, por padrão ela pegará o valor de um bloco externo, imprimindo assim a mensagem 'valor antes do bloco interno'.
- A variável 'var2' no bloco externo recebeu o valor 'valor após bloco interno'. Mas esta atribuição aconteceu após a definição de um bloco interno. Portanto, este valor não está presente no bloco interno.
Exemplo 2: Neste exemplo, vamos encontrar a diferença entre dois números, um declarado no bloco externo e outro no bloco interno. Ambos terão o mesmo nome. Vamos ver como o rótulo do bloco é útil para referir essas variáveis.
<<OUTER_BLOC>> DECLARE ln_val NUMBER :=5; BEGIN <<INNERBLOC>> 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; /
Explicação do código:
- Linha de código 1: Rotulando o bloco externo como “OUTER_BLOCK”.
- Linha de código 3: Declarando uma variável 'ln_val' como NUMBER com o valor inicial de “5”.
- Linha de código 5: Rotulando o bloco interno como “INNER_BLOCK”
- Linha de código 7: Declarar uma variável 'ln_val' no bloco interno como NUMBER com o valor inicial “3”.
- Linha de código 9: Imprimindo a diferença no valor de 'ln_val' do bloco externo e interno. O " . ”O formato é usado para referir essas variáveis para evitar conflitos devido ao mesmo nome de variável.
Resumo
Neste tutorial, aprendemos como criar um bloco aninhado e como lidar com o escopo no bloco interno e nos blocos externos. Também vimos um exemplo onde as variáveis do bloco interno e externo foram referenciadas dentro do bloco interno.