제어 구조

tbPSM이 제공하는 제어 구조를 설명합니다.

개요

제어 구조는 내부에 조건식을 포함하는 문장의 집합으로써, 조건식이 갖는 값에 의해 SQL 문장의 실행 순서가 결정됩니다. 조건식은 진리식으로써 결과 값은 TRUE, FALSE, NULL 중 하나를 반환합니다.

제4세대 언어인 SQL과는 달리 절차적인 언어에서는 SQL 문장의 실행 순서가 프로그램의 결과에 영향을 미칩니다. tbPSM은 이러한 절차적인 언어의 중요한 특성 중의 하나인 제어 구조를 SQL 문장에서 사용하게 함으로써 보다 효율적이고 유연한 프로그램을 작성할 수 있습니다.

tbPSM이 제공하는 제어 구조는 특정 작업을 수행하는 조건 구조와 반복적인 작업을 수행하는 반복 구조를 제공합니다. 뿐만 아니라 단순 구조도 제공합니다.

  • 조건 구조 : IF, CASE

  • 반복 구조 : LOOP

  • 단순 구조 : GOTO

IF

IF 문은 다음과 같이 3가지 형태를 지원합니다.

형태
설명

IF-THEN

한 가지 경우만을 선택하여 사용하는 가장 단순한 형태

IF-THEN-ELSE

두 가지 중에서 하나를 선택하여 사용

IF-THEN-ELSEIF

다양한 경우에서 하나를 선택하여 사용

I3F-THEN 문

IF-THEN 문은 여러 IF 문 중 가장 단순한 구조로서 조건식의 결과 값이 TRUE인 경우 THEN 절의 실행문(또는 실행문의 집합)을 수행합니다.

사용 방법은 다음과 같습니다.

IF-THEN 문은 조건식의 결과 값이 TRUE일 때만 실행문이 실행됩니다. 조건식의 결과 값이 FALSE이거나 NULL인 경우에는 실행문은 실행되지 않고 제어가 다음 문장으로 이동합니다.

다음은 IF-THEN 문의 예입니다.

위 예에서 보듯이 employee_num이 100보다 큰 경우에만 pay_bonus 프러시저가 실행됩니다.

IF-THEN-ELSE 문

IF-THEN-ELSE 문은 조건식의 결과 값이 TRUE 값을 가질 경우 THEN 절의 실행문-1을 수행하고, 나머지 의 경우에는 ELSE 절의 실행문-2를 수행합니다.

사용 방법은 다음과 같습니다.

IF-THEN 문과는 달리 IF-THEN-ELSE 문에서는 조건식의 결과 값이 FALSE이거나 NULL인 경우 ELSE절의 실행문-2를 실행합니다.

다음은 IF-THEN-ELSE 문의 예입니다.

위 예에서 보듯이 employee_num이 100보다 큰 경우 조건식의 결과 값이 TRUE이므로, up_grade 프러시 저가 실행되고, employee_num이 100보다 작거나 같은 경우에는 조건식의 결과 값이 FALSE이므로 down_grade 프러시저가 실행됩니다.

IF-THEN-ELSIF 문

IF-THEN-ELSIF 문은 다양한 조건과 그에 따른 실행문을 제시하는 복잡한 구조의 조건 구조입니다. 사용방법은 다음과 같습니다.

IF-THEN-ELSEIF 문은 조건식의 결과 값이 TRUE인 경우 조건식에 속하는 THEN 절의 실행문을 수행합니다.

조건식은 순서대로 수행되며, 조건식의 결과 값이 TRUE일 때까지 제어가 이동됩니다. 만약 조건식의 결과 값이 TRUE인 조건식이 한 개 이상인 경우에는 최초로 만나는 실행문 하나만을 실행합니다. 그 외 나머지 실 행문은 무시됩니다.

circle-info

참고

IF-THEN-ELSE 문을 여러 번 중첩하면 IF-THEN-ELSIF 문과 동일하게 구현할 수 있습니다. 그러나 보다 이해하기 쉽고 명확한 프로그램의 작성과 디버깅 과정의 편의를 위해 IF-THEN-ELSIF 문을 사용할 것을 권장합니다.

다음은 IF-THEN-ELSEIF 문의 예입니다.

위 예에서 employee_num의 값이 380이라면, 두 번째, 세 번째 조건식이 모두 TRUE 값을 갖게 됩니다. 앞서 말했지만, 조건식의 결과 값이 TRUE인 조건식이 다수이면 최초로 만나는 실행문 하나만 실행됩니다. 따라서 두 번째 조건식의 실행문인 pay_salary 프러시저만 실행되고, 세 번째 조건식의 실행문인 down_grade 프러시저는 실행되지 않습니다.

CASE 문

CASE 문은 여러 개의 실행문 중에서 하나를 선택하여 실행합니다. CASE 문은 IF-THEN-ELSIF 문과 비슷한 성격을 가지며, 실제로 조건식을 포함하는 CASE 문은 IF-THEN-ELSIF 문으로 동일하게 다시 작성할 수 있습니다.

CASE 문은 동등 비교에 사용됩니다. 표현식의 결과 값과 일치하는 연산식에 속하는 THEN 절의 실행문을 실행합니다. 동등 비교 이외의 경우에는 조건식을 포함하는 CASE 문을 사용합니다.

사용 방법은 다음과 같습니다.

IF 문과 마찬가지로, 조건을 만족하는 실행문이 있는 경우 해당 실행문을 수행한 후 자동적으로 CASE 문 이후의 문장을 수행합니다. 따라서 일반적인 프로그래밍 언어와는 달리 BREAK 문을 명시할 필요가 없습니다.

또한 IF 문과 마찬가지로 조건을 만족하는 연산식이 하나 이상 있는 경우에는 첫 번째 연산식의 실행문만 수행하고, 그 외 나머지 실행문은 무시됩니다.

다음은 CASE 문의 예입니다.

위 예에서 보듯이 CASE 문에서 ELSE 절은 선택적으로 사용할 수 있습니다. 만약 사용자가 ELSE 절을 정의하지 않은 경우 표현식의 결과 값과 동일한 연산식이 없으면 tbPSM은 예외 상황을 발생시키고 예외 처리 루틴으로 제어를 이동합니다.

조건식을 포함하는 CASE

표현식이 없거나 조건식을 계산한 후의 결과 값이 TRUE인 경우에는 해당 절의 실행문을 수행합니다.

사용 방법은 다음과 같습니다.

다음은 조건을 포함하는 CASE 문의 예입니다.

LOOP 문

LOOP 문을 사용하면 반복 구조를 작성할 수 있습니다.

LOOP 문은 다음과 같이 세 가지 형태를 지원합니다.

형태
설명

단순 LOOP

단순히 반복을 계속하는 LOOP 문

FOR-LOOP

조건을 부여할 수 있는 LOOP 문

WHILE-LOOP

조건을 부여할 수 있는 LOOP 문

LOOP 문은 주로 EXIT 문과 결합하여 사용됩니다.

단순 LOOP

단순 LOOP 문은 LOOP와 END LOOP 사이에 생성된 블록을 반복해서 수행합니다.

사용 방법은 다음과 같습니다.

EXIT 문의 사용

EXIT 문을 사용할 때 LOOP 문의 내부에서 EXIT를 만나면 무조건 LOOP 문을 빠져 나오게 됩니다. 그러나 정의된 EXIT 문이 없으면 LOOP 문은 무한히 반복합니다.

따라서 다음 예와 같이 IF 문과 EXIT 문을 함께 사용하여 해당 조건식을 만족하는 경우 LOOP를 빠져 나오도록 지정할 수 있습니다.

EXIT WHEN 문의 사용

IF 문과 EXIT 문을 함께 사용하는 대신에 EXIT WHEN 문을 사용하면 일정한 조건을 만족할 때까지 EXIT문을 수행할 수 있습니다.

사용 방법은 다음과 같습니다.

위 방법은 아래와 동일한 의미를 갖습니다.

다음은 EXIT WHEN 문의 예입니다.

레이블의 사용

LOOP 문이 시작하기 전에 LOOP 문 앞에 레이블을 붙일 수 있습니다. 예를 들어 아래와 같이 레이블이 정의된 경우에는 EXIT 문에 레이블을 명시하여 여러 개의 LOOP 문을 한꺼번에 빠져나올 수 있습니다.

ⓐ LOOP 문의 조건이 맞는 경우에 해당됩니다.

ⓑ 두 개의 LOOP 문에서 동시에 빠져 나와 LOOP 문 다음의 SQL 문장으로 이동합니다.

FOR-LOOP 문

FOR-LOOP 문은 실행문을 정해진 수만큼 반복하고 싶은 경우에 사용합니다. FOR-LOOP 문은 SQL 문장 내부에 반복 카운터(loop_counter)를 가지고 있어서 일정한 수만큼 LOOP 문을 반복할 수 있습니다.

사용 방법은 다음과 같습니다.

항목
설명

loop_counter

  • 일반적으로 변수를 사용

  • 시스템이 내부적으로 선언하기 때문에 명시적으로 선언할 필요가 없음

  • loop_counter를 볼 수 있는 범위는 FOR-LOOP 문의 내부

low_bound, high_bound

  • LOOP 문의 범위를 지정

  • 주로 숫자 상수를 사용

  • 그러나 반드시 숫자 상수일 필요는 없으며, 숫자 상수로 변환될 수 있는 임의의 식을 사용할 수 있음

다음은 FOR-LOOP 문의 예입니다.

위 예에서 보듯이 loop_counter는 box_num 변수로 정의하고, low_bound와 high_bound는 1부터 시작하여 100에 도달할 때까지 값을 1씩 증가시키며 LOOP 문을 반복합니다. low_bound와 high_bound는 반드시 숫자 상수일 필요는 없습니다.

예를 들면 다음과 같습니다.

동일한 이름의 변수 사용

만약 외부에서 loop_counter와 동일한 이름을 갖는 변수를 선언한 상태라면, 다음 예와 같이 FOR-LOOP문의 내부 블록에서는 사용자가 외부에 선언한 변수는 loop_counter에 의해 영향을 받지 않습니다.

REVERSE 예약어 사용

FOR LOOP 문 안에서 REVERSE 예약어를 사용하면 loop_counter가 high_bound에서 low_bound로 감소하면서 LOOP 문을 반복하게 됩니다.

사용 방법은 다음과 같습니다.

만약 REVERSE 예약어를 사용하지 않는 경우라면 low_bound와 high_bound는 FOR-LOOP 문과 같은 순서로 LOOP 문을 수행합니다. 단, high_bound가 low_bound보다 먼저 나오는 경우 RESERVE 예약어의 사용과 관계없이 tbPSM 프로그램은 에러를 발생시킵니다.

다음은 REVERSE 예약어를 사용한 FOR-LOOP 문의 예입니다.

위 예에서 보듯이 100에서 시작해서 1에 도달할 때까지 1씩 감소합니다.

WHILE-LOOP 문

WHILE-LOOP 문은 WHILE 다음에 나오는 조건식을 계산하여 결과 값이 TRUE인 동안에만 실행문을 반복적으로 실행합니다. 조건식의 결과 값이 TRUE가 아닌 경우에는 LOOP 이후 다음 문장으로 제어가 이동됩니다.

사용하는 문법은 다음과 같습니다.

즉, LOOP 문 자체가 조건식을 포함하고 있습니다. 따라서 EXIT WHEN 문을 별도로 사용하지 않아도 조건에 따라 LOOP 문에서 빠져나올 수 있습니다.

다음 문장은 단순 LOOP 문과 동일한 의미의 예입니다.

GOTO 문

GOTO 문은 실행문이나 블록에 추가한 레이블과 함께 동작합니다. GOTO 문이 실행되면 GOTO 문에 명시 된 레이블을 찾아서 해당 실행문이나 블록으로 제어를 이동합니다. 일반적인 프로그래밍 언어와는 달리 LABEL 문이 GOTO 문보다 먼저 올 수 있습니다.

사용하는 방법은 다음과 같습니다.

IF 문이나 LOOP 문의 내부에서 외부로 분기하는 경우처럼 제어 구조에서 GOTO 문을 사용할 때가 있지만, GOTO 문은 사용할 때에는 다음과 같은 주의가 필요합니다. 예를 들어 다음과 같이 IF 문이나 LOOP 문의 중간으로 분기하는 것은 적합하지 않으므로 주의해야 합니다.

또한 IF 문의 중간에서 다른 IF 문의 내부로 분기하는 것도 허용하지 않으며, 외부 블록을 수행하는 도중에 내부 블록의 중간으로 분기하는 것도 맞지 않습니다. 마지막으로 예외 처리 루틴에서 실행 블록으로 분기하는 것도 허용하지 않습니다.

EXIT 문

EXIT 문은 LOOP 문의 내부에 사용하면 자신을 포함하고 있는 LOOP 문에서 빠져 나올 수 있습니다. 또한 LOOP 문에 레이블을 붙일 수 있기 때문에 EXIT 문에 레이블을 명시하면 여러 개의 LOOP 문을 동시에 빠 져나올 수 있습니다.

EXIT 문에 레이블을 명시하는 방법은 다음과 같습니다.

다음은 레이블을 사용하여 두 개의 LOOP 문을 동시에 빠져 나오는 예입니다.

EXIT 문을 수행하기 전에 제시한 조건식을 만족하는지 확인합니다. 조건식을 만족하는 경우에는 해당 LOOP문을 빠져 나올 수 있습니다.

NULL 문

NULL 문은 프로그램상에 명시되어도 실제로는 아무런 일도 발생하지 않습니다.

프로그램을 설계할 때 서브 프로그램의 내용을 일시적으로 NULL 문으로 대체하거나, 또는 제어 구조를 작성하면서 실행문을 NULL 문으로 대체하는 경우라면 NULL 문은 매우 유용합니다.

예를 들면 다음과 같습니다.

형식적으로 실행문이 반드시 필요한 경우(레이블을 사용하는 경우)에도 다음과 같이 NULL 문을 사용할 수 있습니다.

CONTINUE 문

CONTINUE 문은 LOOP 내에서 해당 LOOP를 건너뛰고 다음 LOOP로 진행할 때 사용됩니다. LOOP를 작성 할 때 특정 조건에서 해당 LOOP를 수행하지 않을 경우 CONTINUE 문을 사용하면 편리합니다.

예를 들면 다음과 같습니다.

CONTINUE WHEN 문 사용

IF 문과 CONTINUE 문을 함께 사용하는 대신에 CONTINUE WHEN 문을 사용하면 일정한 조건을 만족할 때 해당 LOOP를 건너뛰고 다음 LOOP로 진행할 수 있습니다.

사용 방법은 다음과 같습니다.

위 방법은 아래와 동일한 의미를 갖습니다.

다음은 CONTINUE WHEN 문의 예입니다.

레이블 사용

LOOP 문에 레이블이 정의된 경우에는 CONTINUE 문에 레이블을 명시하여 상위 LOOP로 돌아갈 수 있습니다.

CONTINUE 문에 레이블을 명시하는 방법은 다음과 같습니다.

다음은 레이블을 사용하여 inner LOOP를 빠져 나와 outer LOOP로 돌아가는 예입니다.

CONTINUE 문을 수행하기 전에 제시한 조건식을 만족하는지 확인합니다. 조건식을 만족하는 경우에는 inner LOOP의 다음 iteration이 아닌 outer LOOP의 다음 iteration으로 돌아갈 수 있습니다.

Last updated