본문 바로가기

Oracle

PLSQL - 필수 개념 정리

PL SQL에서 패키지는 서로 관련 있는 프로시저 또는 함수들의 집합입니다.

패키지는 선언부(head)와 본문(body)로 나누어집니다.

선언부에는 패키지에 포함되는 프로시저, 함수, 커서, 변수, 예외 절 등을 선언하는 부분입니다.

특징은 선언부에서 선언한 것은 패키지 전체에서 사용할 수 있어서 전역 변수처럼 사용 가능하다는 것입니다.

패키지의 본문에서는 선언부에 선언한 프로시저들의 실행 부분을 정의하게 됩니다.

즉, 프로시저를 작성하는 부분입니다. 프로시저의 작성 부분은 총 3가지 section으로 나누어집니다.

선언부, 실행부, 예외처리 부입니다. 다른 부분들을 작성하는 것은 선택적이지만 실행부(Begin~End)는 필수적으로 존재해야 합니다.

선언부부터 보도록 하겠습니다.

선언부에는 변수, 상수, CURSOR, 유저가 정의한 익셉션 등을 선언합니다. 

실행부에는 SQL문들이 실제로 작성되고 반복문과 조건문을 통해 SQL문을 프로그래밍 언어처럼 사용 가능하게 됩니다.

예외처리부에는 예외에 대한 처리부분입니다. 밑에서 이야기할 것이지만, 예외에는 이미 선언되어 있는 예외와 사용자가 직접 정의할 수 있는 예외가 존재합니다.

선언부에서 사용자가 직접 예외를 정의하고, 그 예외가 발생한다면 예외처리부에 있는 사용자 정의 예외를 참조하여 예외가 발생하게 됩니다.

이것이 기본적인 패키지 프로시저의 구성과 개념이고 제가 중요하다고 생각하는 것 또는 헷갈리는 것을 밑에 작성하겠습니다.

pl sql에는 변수에 대한 타입이 존재합니다. 그러나 어떤 변수 타입인지 알지 못할 경우 다른 테이블의 컬럼 데이터 타입을 참조하여 사용할 수 있습니다.

%type을 사용함으로써 사용할 수 있고, 나중에 컬럼의 데이터 타입이 수정되어도 따로 수정하지 않아도 된다는 장점이 존재합니다.

다음은 커서부분입니다. PL/SQL에서 가장 중요한 부분이라고 할 수 있습니다.

커서에는 명시적, 암시적 커서 두 가지가 존재합니다. 

암시적 커서란 SQL문장이 실행되는 주소라고 생각하시면 됩니다.(일종의 포인터)

모든 오라클 DB에서 SQL문장이 실행되면 암시적인 커서를 갖게 되고 이 암시적 커서를 활용하여 더 효과적인 실행 로직을 작성할 수 있습니다.

암시적인 커서는 실행과 동시에 open clsoe가 자동으로 일어나게 됩니다.

open은 커서를 활성화하는 개념이라고 생각하시면 되고 clsoe는 사용을 했으니까 자원을 해제해주는 것입니다.

명시적인 커서는 프로그래머가 선언할 수 있는 이름이 존재하는 커서입니다.

이런 비유가 맞을지는 모르겠지만 자바에서 method를 만들어서 매개변수도 활용하여 return 값을 받는데 커서도 비슷한 방식으로 활용된다고 저는 느꼈습니다.

명시적인 커서로 커서를 선언하는데 매개변수 역시 존재할 수 있으며 명시적인 커서는 자동으로 open close가 일어나지 않기 때문에 하나씩 실행해줘야 합니다.

기본적인 실행 흐름은 커서 선언 -> open -> fetch(레코드가 빌 때 까지) -> clsoe이며 fetch는 커서의 현재 데이터 행을 프로그래머가 정한 변수에 넘기는 행위입니다.

그러나 이런 반복적인 open fetch clsoe를 선언해주면 불편하므로 for문에서 사용하게 될 경우 open fetch clsoe가 자동으로 사용되어 더 편리하게 cursor를 활용할 수 있습니다.

sql문과 커서를 활용해서 프로시저가 실행되면 프로그램에서는 요청한 프로시저가 정상적으로 실행이 되었는지 알 필요가 있습니다.

만약 예외가 발생했다면 어느 부분에서 예외가 발생했고 그러한 것을 추적하기 위한 장치 역시 필요합니다.

이 때문에 plsql에서는 SQLCODE와 SQLERRM을 제공합니다. 

SQLCODE에서는 프로그램이 정상 실행하게 된다면 0을 반환하고 그렇지 않으면 예외에 따른 오류 코드를 반환합니다.

SQLERRM에는 SQLCODE에 오류코드에 대한 에러 메세지가 담겨있습니다.

즉 프로그램에서는 SQLCODE와 SQLERRM을 활용해 방어 로직을 구성할 수 있게 됩니다.

이상으로 PL SQL에 대한 제가 공부한 개념들을 작성해보았습니다.. 

혹시 잘못된 지식으로 수정해야 할 부분이 있다면 코멘트 해주시면 감사하겠습니다.

감사합니다.

'Oracle' 카테고리의 다른 글

상위 N개 레코드 조회하기  (0) 2020.05.24
CHAR, VARCHAR, VARCHAR2 차이점  (2) 2020.03.25
PL/SQL - DUAL TABLE  (0) 2020.03.18
PL/SQL - 대입연산자  (0) 2020.03.17
PL/SQL - 08(Package)  (0) 2020.03.16