database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 2674 게시물 읽기
No. 2674
PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (3)
작성자
김일형
작성일
2001-05-02 12:38
조회수
3,632

안녕하세요, 김일형입니다.

 

계속 이어지는 중요한 부분입니다.

 

//////////////////////////////////////////////////////////////////////////////

 

24.2.6. 제어 구조

 

이 제어 구조가 아마도 PL/SQL에서 가중 유용한 (또 중요한) 부분이 아닐까 한다. PL/pgSQL의 제어구조를 이용하여 사용자는 PostgreSQL의 데이터를 다양하고 강력하게 다룰수 있다.

 

24.2.6.1. 조건 제어: IF 문

 

IF문은 특정 조건에 따라 주어진 일을 하는 문장이다. PL/pgSQL는 세가지 형태를 가지는데 그 것들은 IF: IF/THEN, IF/THEN/ELSE, IF/THEN/ELSE IF 이다.

주목: PL/pgSQL의 IF문은 짝지워진 END IF 가 필요한다. ELSE/IF의 경우는 2개의 END IF가 필요한데 하나는 첫번째 IF를 위해, 그리고 다른 하나는 ELSE IF를 위해서 이다.

 

IF/THEN

IF/THEN 문은 IF문의 가장 간단한 형태이다. THEN 과 END IF사이의 문장들은 주어진 조건이 true일때 수행된다. 그렇지 않으면 END IF 다음에 나오는 문장들로 실행이 넘어간다.

 

예)

IF v_user_id <> 0 THEN

UPDATE users SET email = v_email WHERE user_id = v_user_id;

END IF;

 

IF/THEN/ELSE

IF/THEN/ELSE 문은 IF/THEN 문에 해당 조건이 FALSE가 되었을 경우 실행될 문장들을 추가한 형태이다.

 

예1)

IF parentid IS NULL or parentid = ''''

THEN

return fullname;

ELSE

return hp_true_filename(parentid) || ''/'' || fullname;

END IF;

 

예2)

IF v_count > 0 THEN

INSERT INTO users_count(count) VALUES(v_count);

return ''t'';

ELSE

return ''f'';

END IF;

 

다음에 나오는 예처럼 IF문은 중첩되어 사용될 수 있다.

 

IF demo_row.sex = ''m'' THEN

pretty_sex := ''man'';

ELSE

IF demo_row.sex = ''f'' THEN

pretty_sex := ''woman'';

END IF;

END IF;

 

IF/THEN/ELSE IF

"ELSE IF"문이 사용되는 것은 실제로 ELSE문 안에 IF문을 중첩하는 것과 같다. 그렇기 때문에 END IF문이 각 중첩된 IF와 상위 IF/ELSE를 위해 필요한 것이다.

 

예)

 

IF demo_row.sex = ''m'' THEN

pretty_sex := ''man'';

ELSE IF demo_row.sex = ''f'' THEN

pretty_sex := ''woman'';

END IF; /* <// 요기를 주목하시라... 요게 일반적인 언어와 다른 부분이다. */

END IF;

 

24.2.6.2. 반복 제어: LOOP, WHILE, FOR 그리고 EXIT

LOOP, WHILE, FOR 그리고 EXIT 문을 이용하여 PL/pgSQL 프로그램을 반복적으로 실행하는 흐름제어를 할 수 있다.

 

 

LOOP 문...

 

[<<label>>]

LOOP

실행할 문장

END LOOP;

 

위와같은 조건이 없는 반복문은 반드시 명백하게 EXIT을 사용하여 종료되야 한다. 선택적으로 사용할 수 있는 label은 중복된 반복문 에서 빠져나오고자 할 때 EXIT문에 의해 사용된다.

 

EXIT 문...

 

EXIT [ label ] [ WHEN 표현식 ];

 

만약에 label이 명시되지 않으면 중첩된 반복문에서 내부의 반복문이 끝나면 내부 반복문의 END LOOP 다음에 나오는 문장을 수행한다. 그렇지 않고 label이 명시되면 주어진 label이 붙은 반복문 또는 블럭을 빠져나가게 된다. 그리고 반복문 또는 블럭의 해당되는 END 문 다음 문장을 처리한다. 그 label은 중첩된 반복문에서 현재 수행중인 내부 반복문의 label이거나 상위 반복문의 label이어야한다.

 

예)

 

LOOP

// 실행할 계산문

IF count > 0 THEN

EXIT; // 반복문 탈출

END IF;

END LOOP;

 

LOOP

// 실행할 계산문

EXIT WHEN count > 0;

END LOOP;

 

BEGIN

// 실행할 계산문

IF stocks > 100000 THEN

EXIT; // 오류! LOOP 블럭 밖에서 EXIT을 사용할 수 없다.

END IF;

END;

 

WHILE 문...

 

WHILE문을 사용하여 주어진 조건을 검사하여 그 조건이 참인 동안 일을 수행하는 반복문을 만들 수 있다.

 

[<<label>>]

WHILE 표현식 LOOP

실행할 문장

END LOOP;

 

 

예)

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP

// 실행할 계산식

END LOOP;

 

WHILE NOT boolean_expression LOOP

// 실행할 계산식

END LOOP;

 

FOR 문...

 

[<<label>>]

FOR 변수이름 IN [ REVERSE ] 표현식 .. 표현식 LOOP

실행할 문장

END LOOP;

 

이 반복문은 주어진 정수형의 범위 내에서 반복 수행한다. 변수 '변수이름'은 자동적으로 정수형으로 생성이 되고 오로지 반복문 내에서만 존재를 한다. 그리고 두 '표현식'은 최소와 최대값의 범위를 나타내는 표현식이다. 그리고 반복 될 때마다 변수의 값은 항상 1씩 증가/감소된다.

 

다음은 FOR 문에대한 예이다. (레코드를 반복하는 FOR에 대한 예는 24.2.7를 참조)

 

FOR i IN 1..10 LOOP

// 실행할 표현식

 

RAISE NOTICE 'i is %',i;

END LOOP;

 

FOR i IN REVERSE 1..10 LOOP

// 실행할 표현식

END LOOP;

 

//////////////////////////////////////////////////////////////////////////////

 

김일형.

[Top]
No.
제목
작성자
작성일
조회
2681[질문]FATAL: StreamServerPort: bind() failed:
차윤주
2001-05-04
2547
3116┕>Re: [질문]FATAL: StreamServerPort: bind() failed:
김명화
2001-07-10 23:39:58
2618
2676PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (5)
김일형
2001-05-02
3917
2675PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (4)
김일형
2001-05-02
3798
2674PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (3)
김일형
2001-05-02
3632
2673PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (2)
김일형
2001-05-02
5008
2672PostgreSQL 로그를 syslog 로 남겼을때의 문제점
정재익
2001-05-02
4621
2670Q] 필드안의 데이터수정..정규표현식?
신영훈
2001-05-01
3628
2671┕>Re: 표준 문자열 함수로 해결 할 수 있을듯.
김상기
2001-05-01 16:49:24
3872
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다