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 2659 게시물 읽기
No. 2659
PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (I)
작성자
김일형
작성일
2001-04-30 13:02
조회수
5,375

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

 

제가 워낙 DBMS를 잘 몰라서, 오늘부터 맘잡고 공부 좀 해보려고 PostgreSQL7.1 메뉴얼을 열어봤습니다. 그런데... 음.. 어렵더군요.

 

그래서 일단 그래도 좀 관심이 가는 부분이 있어 혼자 아는 것은 그렇고 공부 겸 정보공유 겸... 겸사겸사해서 없는 실력에도 번역해봤습니다.

 

PostgreSQL에서 사용할 수 있는 PL/pgSQL에 대한 부분입니다. 오라클의 PL/SQL하고 같은 개념의 것 같거든요.

그래서 재미 있을 것 같아 한번 올려봅니다. 그런데 해석 실력이 영 형편없어서 혹 읽는 분들께 오히려 혼선을 주는 것은 아닌지 상당히 걱정됩니다. /_/;;

 

능력이 없어서 한꺼번에 많이는 못하고 (신생아인 우리 딸이 제가 진득하게 앉아서 뭐하는 것을 못보는 군요....) 일단 좀씩 하는 대로 올려보겠습니다.

 

다른 분께도 도움이 되었으면 합니다.

 

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

Chapter 24. PL/pgSQL / SQL Procedural Language

 

목차

 

24.1. 개요

24.1.1. PL/pgSQL 사용의 잇점

24.1.2. PL/pgSQL 에서 개발

24.2. 세부내용

24.2.1. PL/pgSQL 구조

24.2.2. 주석문(Comment)

24.2.3. 변수와 상수

24.2.4. 표현

24.2.5. 문장

24.2.6. 제어문

24.2.7. RECORD 와 작업

24.2.8. 작업중단과 메세지

24.2.9. 예외

24.3. Trigger Procedures

24.4. 예제

24.5. Oracle PL/SQL로부터 변환

24.5.1. 주요 차이점

24.5.2. 변환 Function

24.5.3. Procedures

24.5.4. Packages

24.5.5. 주의해야할 기타사항

24.5.6. 부록

 

PL/pgSQL 는 Postgres 데이터베이스를 위한 적재가능한 절차형 언어입니다.

 

24.1. 개요

 

PL/pgSQL의 디자인의 목표는 다음을 위한 function과 trigger procedure를 생성하고 사용할 수 있는 적재가능한 절차형 언어를 만드는데 있다.

 

/ function과 trigger procedure 생성

/ SQL 언어에 제어 구조의 추가

/ 복잡한 계산의 수행

/ 모든 사용자 정의형, 함수, 연산자의 계승

/ 서버에 의해 신뢰받을 수 있는 정의

/ 사용의 용이

 

PL/pgSQL 호출 처리기(call handler)는 함수의 소스 코드를 분석하고 그 함수가 처음 호출될 때 내부 바이트코드를 생성한다. 생성된 바이트코드는 함수의 오브젝트 ID를 이용해 호출 처리기에 의해서 각각 구분된다. 이 같은 구조는 DROP/CREATE sequence에 의해 함수의 변경이 이루어질 때 데이터베이스에 대한 새로운 연결 요구없이 이루어지도록 한다.

 

함수에서 사용된 모든 표현과 SQL 문장에 대해, PL/pgSQL 바이트코드 해석기는 SPI manager의 SPI_prepare() 와 SPI_saveplan() 함수를 이용해서 준비된 실행계획(prepared execution plan) 을 생성한다. 이러한 과정은 PL/pgSQL 함수 안에 각각의 함수의 문장이 최초로 처리될 때 이루어진다. 그래서, 함수는(필요한 실행계획을 포함하는 조건 코드를 가지고 있음) 데이터베이스의 연결이 되어있는 동안만 실제 사용될 실행계획들을 준비하고 저장한다.

 

그러니까 사용자는 사용자 정의 함수를 만들 때 위의 사항을 유념해야한다.

예를 들면

 

CREATE FUNCTION populate() RETURNS INTEGER AS '

DECLARE

// Declarations

BEGIN

PERFORM my_function();

END;

' LANGUAGE 'plpgsql';

 

만약에 사용자가 위의 함수를 만들었다면, 서버는 그 바이트 코드에 my_function()에 대한 OID를 참조할 것입니다. 후에 사용자가 my_function()을 지우고 재생성하였다면, populate()는 my_function()를 더이상 찾지 못하게 된다. 그러니까 my_function()을 지우고 재생성한 후 populate()도 재생성 해야 한다는 뜻이다.

 

PL/pgSQL이 실행 계획을 이와같이 처리하기 때문에, PL/pgSQL내에 직접적으로 사용되는 쿼리는 매 실행마다 같은 테이블과 필드를 참조해야만 한다. 이 말은 사용자는 함수의 파라메터를 쿼리에서 사용할 테이블 또는 필드명으로 사용할 수 없다는 것이다. 이 제한을 피하기 위해서 사용자는 PL/pgSQL의 EXECUTE 문을 이용하여 동적 쿼리 (dynamic query)를 사용할 수 있다. // 그렇지만 매 수행시마다 새로운 쿼리 계획을 만드는 댓가를......

 

사용자 정의형에 대한 입출력 변환과 계산 함수를 제외하고, C언어 함수에 정의될 수 있는 어떤 형이라도 PL/pgSQL과 함께 사용될 수 있다. 복잡한 조건 계산 함수와 나중에 그 형을 이용하여 연산자를 정의하거나 기능형 index(functional index)에 그 형을 사용할 수 있다.

 

24.1.1. PL/pgSQL 사용의 잇점

 

/ 더 나은 성능

/ SQL 지원

/ 이동가능성 또는 이식성?? (Portability)

 

24.1.1.1. 더 나은 성능

 

SQL은 PostgreSQL (그리고 거의 모든 관계형 데이터베이스)에서 질의 언어(query language)로 사용하는 언어이다. 이 언어는 옮기는 것이 가능하고 배우기 쉽다. 그렇지만 모든 SQL문은 반드시 각각 데이터베이스에 의해 수행되야만 한다.

 

그 말은 사용자의 클라이언트는 매 쿼리를 데이터베이스 서버로 전송해야 한다는 말이다.

그래서 그것이 처리되는 동안 기다렸다가 결과를 수신하고, 결과를 토대로 좀 계산을 한다음에 서버로 또다른 쿼리를 보낸다. 이러한 모든 과정은 내부 프로세스 통신을 유발하고 또한 사용자 클라이언트가 데이터베이스 서버와 다른 장비에 있다면 네트워크의 부담을 줄 수 있다.

 

PL/pgSQL로 사용자는 복수의 계산과 데이터베이스 내의 쿼리들을 모음으로써, 그러니까 절차형 언어의 강력함과 SQL의 사용 용이성과 함께 클라이언트/서버의 통신 부담을 유발하지 않으므로 처리 시간을 단축한다. 그렇기 때문에 PL/pgSQL을 이용하여 사용자는 눈에 띄는 성능 향상을 가져 올 수 있다.

 

24.1.1.2. SQL 지원

 

PL/pgSQL은 SQL의 유연성과 용이성에 더해 절차형 언어의 강력함도 가지고 있다. PL/pgSQL로 사용자는 SQL의 모든 자료형(datatype), Column, 연산자와 함수를 사용할 수 있다.

 

24.1.1.3. 이동가능성 또는 이식성?? (Portability)

 

PL/pgSQL 함수는 PostgreSQL에서 수행되기 때문에, 이 함수들은 PostgreSQL이 있는 다른 어떤 환경에서도 수행된다. 그렇게 해서 사용자는 코드를 재사용할 수 있고 개발비를 절감할 수 있다.

 

24.1.2. PL/pgSQL 에서 개발

 

PL/pgSQL에서 개발은 상당히 직선적이고, 특히 사용자가 Oracle의 PL/SQL과 같은 다른 데이터베이스의 절차 언어를 개발해본 경험이 있다면 PL/pgSQL에서 개발을 위한 2가지의 좋은 방안이 있다. 그 것은...

 

/ 텍스트 편집기를 이용한 화일을 psql을 통해 적재하는 방식

/ PostgreSQL의 GUI 도구인 pgaccess을 사용하기

 

첫번째 경우는 사용이 간단한 사용자가 원하는 텍스트 편집기를 사용하여 사용자 함수를 만들고 다른 콘솔에서 psql을 이용하여 그 함수들을 적재하는 방식이다. 만일 사용자가 이 방식 을 사용한다면 (또는 사용자가 초보 또는 디버그 중 이면) 항상 함수를 데이터베이스로 적재하기 전에 이미 데이버베이스 안에 있는 기존 함수를 제거해야한다. 예를 들면

 

drop function testfunc(integer);

create function testfunc(integer) return integer as '

....

end;

' language 'plpgsql';

 

사용자가 처음 위의 함수가 있는 화일을 적재할 때, PostgreSQL은 이 함수가 없다고 경고 메세지를 보여주고나서 그 함수를 생성할 것이다. SQL 화일 (filename.sql)을 "dbname"이라는 데이터베이스로 적재할 경우 다음의 명령을 사용한다.

 

psql /f filename.sql dbname

 

두번째의 경우는 PostgreSQL의 GUI 도구인 pgaccess를 사용하는 것이다. 이것은 escaping single/quote 와 같이 편리한 점이 있고, 재생성과 함수 디버그에 편리한 장점이 있다.

 

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

 

아! 그리고 원본의 위치는 아래와 같습니다.

http://postgresql.readysetnet.com/users/lounge/docs/7.1/programmer/plpgsql.html

 

다음에 또 올리겠습니다. (이번에는 지루한 개요얘기였네요...)

 

김일형.

[Top]
No.
제목
작성자
작성일
조회
2670Q] 필드안의 데이터수정..정규표현식?
신영훈
2001-05-01
3628
2671┕>Re: 표준 문자열 함수로 해결 할 수 있을듯.
김상기
2001-05-01 16:49:24
3873
2663postgreSQL start시키는법과 종료시키는법좀 가르쳐 주세요
이상학
2001-04-30
3387
2666┕>Re: postgreSQL start시키는법과 종료시키는법좀 가르쳐 주세요
정재익
2001-04-30 19:08:54
3977
2668┕>Re: postgreSQL start시키는법과 종료시키는법좀 가르쳐 주세요
김일형
2001-04-30 22:58:44
4363
2661수치형의 자동 증가.
꼬마
2001-04-30
4170
2662┕>Re: 수치형의 자동 증가.
정재익
2001-04-30 16:57:19
4100
2664 ┕>Re: Re: 수치형의 자동 증가.
꼬마.
2001-04-30 18:18:39
4050
2665  ┕>Re: Re: Re: 수치형의 자동 증가.
정재익
2001-04-30 19:02:04
4327
2678 ┕>mysql 의 자동증가와는 좀 다르군요..
yundream
2001-05-02 13:58:54
4394
2682  ┕>Re: PostgreSQL 에서의 자동증가값
정재익
2001-05-04 13:46:39
8601
2659PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (I)
김일형
2001-04-30
5375
2660┕>Re: PL/pgSQL - SQL Procedural Language 메뉴얼 번역 (I)
정재익
2001-04-30 15:11:55
4182
2667 ┕>Re: Re: 좋습니다.... 그런데...
김일형
2001-04-30 22:51:51
3929
2669  ┕>Re: Re: Re: 영어 실력이야 뭐~~~
정재익
2001-04-30 23:27:27
3843
2656mysql의 order by rand() 와 같은 결과를 주는 쿼리는 어떻게?
김동관
2001-04-29
3967
2657┕>Re: mysql의 order by rand() 와 같은 결과를 주는 쿼리는 어떻게?
정재익
2001-04-30 00:26:56
4652
2775 ┕>Re: Re: mysql의 order by rand() 와 같은 결과를 주는 쿼리는 어떻게?
김상기
2001-05-22 01:05:18
4526
2654안녕하세요, PostgreSQL을 운영하게된 김일형입니다.
김일형
2001-04-28
4424
2655┕>Re: 안녕하세요, PostgreSQL을 운영하게된 김일형입니다.
정재익
2001-04-29 03:00:51
4612
2651[질문] 알파컴에서 postgresql 을 어케 설치해야 하나여??
박기정
2001-04-26
3822
2652┕>Re: [질문] 알파컴에서 postgresql 을 어케 설치해야 하나여??
정재익
2001-04-26 19:14:42
3879
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다