PL/SQL 변수 범위 및 내부 외부 블록: 중첩 구조

중첩 블록이란 무엇입니까? Oracle?

PL/SQL에서는 각 블록이 다른 블록에 중첩될 수 있습니다. 이를 중첩 블록이라고 합니다. 중첩된 블록은 특정 프로세스를 수행하려는 경우 매우 일반적이며 동시에 이러한 프로세스에 대한 코드는 별도의 컨테이너(블록)에 보관되어야 합니다.

중첩된 블록 개념은 복잡한 내용을 각 블록으로 분리하고, 각 블록의 예외를 바깥 주요 블록 내부에서 처리함으로써 프로그래머의 가독성을 향상시키는 데 도움이 됩니다.

중첩된 블록 구조

블록은 다른 블록에 중첩될 수 있습니다. 이는 실행 부분이나 예외 처리 부분. 이 블록에는 라벨을 붙일 수도 있습니다. 하나의 외부 블록에는 여러 개의 내부 블록이 포함될 수 있습니다. 각 내부 블록은 다시 한 번 PL/SQL 블록, 따라서 내부 블록의 모든 속성과 특성은 외부 블록과 동일합니다. 아래 이미지는 중첩된 블록 구조를 그림으로 표현한 것입니다. 상위 블록은 기본 블록이고 하위 블록은 중첩 블록입니다.

중첩된 블록 구조

다음은 중첩된 블록의 구문입니다.

중첩된 블록 구조

중첩 블록 구문

<<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;
  • 위 구문은 총 XNUMX개의 블록을 포함하는 중첩 블록을 보여줍니다.
  • 이 블록에는 'outer_block' 및 'inner_block'이라는 라벨이 붙어 있습니다.

중첩 블록의 범위: 가변 범위

중첩된 블록에서는 각 블록을 사용하기 전에 각 블록의 범위와 가시성을 명확하게 이해해야 합니다. 특히 내부 블록에서는 외부 블록과 내부 블록의 요소가 모두 보이기 때문에 이에 대한 올바른 이해가 필요합니다.

아래 항목에서는 중첩 블록의 범위에 대해 더 자세히 요약합니다.

  • 외부 블록에 선언된 요소와 내부 블록 정의 이전에 정의된 값은 내부 블록 내부에서 볼 수 있습니다.
  • 내부 블록에 선언된 요소는 외부 블록에 표시되지 않습니다. 내부 블록 내에서만 표시됩니다.
  • 외부 블록과 내부 블록은 동일한 이름의 변수를 가질 수 있습니다.
  • 내부 블록과 같은 이름을 가진 변수의 경우 기본적으로 내부 블록에 선언된 변수만 참조합니다.
  • 내부 블록이 내부 블록과 이름이 같은 외부 블록 변수를 참조하려면 외부 블록에 LABELLED를 지정하고 외부 블록 변수는 ' . '

아래 예는 이러한 범위에 대해 더 자세히 이해하는 데 도움이 됩니다.

예제 1: 이번 예제에서는 내부 블록과 외부 블록의 변수 범위를 살펴보겠습니다. 또한, 블록 라벨을 이용하여 변수를 참조하는 방법에 대해서도 알아보겠습니다.

중첩 블록의 범위

<<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;
/

코드 설명 :

  • 코드 라인 1: 외부 블록에 "OUTER_BLOCK"이라는 라벨을 붙입니다.
  • 코드 라인 3: 변수 'var1'을 초기값이 “outer block”인 VARCHAR2(30)로 선언합니다.
  • 코드 라인 4: 'var2' 변수를 초기값 '내부 블록 이전 값'으로 VARCHAR2(30)로 선언합니다.
  • 코드 라인 6: 내부 블록에 "INNER_BLOCK" 라벨 지정
  • 코드 라인 8: 내부 블록의 변수 'var1'을 초기값이 "inner block"인 VARCHAR2(30)로 선언합니다.
  • 코드 라인 10: 'var1' 값을 인쇄합니다. 기본적으로 레이블이 언급되지 않으므로 내부 블록에서 값을 가져오고 'inner_block' 메시지가 인쇄됩니다.
  • 코드 라인 11: 외부 블록 변수 'var1'의 값을 인쇄합니다. 내부 블록에는 동일한 이름의 변수가 있으므로 외부 블록 레이블을 참조해야 합니다. 따라서 '외부 블록'이라는 메시지가 인쇄됩니다.
  • 코드 라인 12: 외부 블록 변수 'var2'의 값을 인쇄합니다. 내부 블록에는 이 이름을 가진 변수가 없기 때문에 기본적으로 외부 블록에서 값을 가져오고 '내부 블록 전 값' 메시지를 인쇄합니다.
  • 외부 블록의 변수 'var2'에는 '내부 블록 이후의 값' 값이 할당되었습니다. 하지만 이 할당은 내부 블록을 정의한 후에 발생했습니다. 따라서 이 값은 내부 블록에 존재하지 않습니다.

예제 2: 이 예에서 우리는 두 숫자의 차이를 찾을 것입니다. 하나는 바깥쪽 블록에서 선언되었고 다른 하나는 안쪽 블록에서 선언되었습니다. 둘 다 같은 이름을 가질 것입니다. 블록 레이블이 이러한 변수를 참조하는 데 어떻게 유용한지 살펴보겠습니다.

중첩 블록의 범위

<<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;
/

코드 설명 :

  • 코드 라인 1: 외부 블록에 "OUTER_BLOCK"이라는 라벨을 붙입니다.
  • 코드 라인 3: 'ln_val' 변수를 초기값 “5”로 NUMBER로 선언합니다.
  • 코드 라인 5: 내부 블록에 "INNER_BLOCK" 라벨 지정
  • 코드 라인 7: 내부 블록의 변수 'ln_val'을 초기값 "3"으로 NUMBER로 선언합니다.
  • 코드 라인 9: 외부 블록과 내부 블록의 'ln_val' 값 차이를 인쇄합니다. “ . ” 형식은 동일한 변수 이름으로 인한 충돌을 피하기 위해 이러한 변수를 참조하는 데 사용됩니다.

제품 개요

이 튜토리얼에서는 중첩 블록을 생성하는 방법과 내부 블록과 외부 블록의 범위를 처리하는 방법을 배웠습니다. 우리는 내부 블록과 외부 블록의 변수가 내부 블록 내부에서 참조되는 예도 보았습니다.