Database

오라클 PL/SQL과 블록(Block) 구조 및 특징

천방지축 개발노트 2020. 9. 26. 14:21

Oracle 에서의 블록(Block) 구조 및

프로시저(Procedure), 사용자 정의 함수(User Defined Function), 트리거(Trigger) 비교 총정리




PL/SQL(Oracle's Procedural Language extension to SQL, 절차형 SQL)이란??

1) 응용 프로그램에서의 데이터베이스 처리 성능을 향상시키기 위해 SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR) 등을 지원하며, 오라클 자체에 내장되어 있는(오라클에서 지원하는) Procedure Language이다.


2) PL/SQL을 이용하여 다양한 저장 모듈(Stored Module)을 개발할 수 있다.

※저장 모듈: PL/SQL문장을 데이터베이스 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램이며, 독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 실행 프로그램. Oracle의 저장 모듈에는 프로시저(Procedure), 사용자 정의 함수(User Defined Function), 트리거(Trigger)가 있다.


3) Block구조로 되어있어 다수의 SQL 문을 한 번에 ORACLE DB로 보내서 처리하므로 수행 속도를 향상 시킬 수 있다. 풀어 말하면, 여러 SQL문장을 Block으로 묶고 한 번에 서버로 보내기 때문에 통신량을 줄일 수 있음. 또한 각 기능별로 모듈화 가능하다는 장점이 있다.




PL/SQL 블록(Anonymous Block) 구조 및 특징

PL/SQL Block Structure

1) 위 그림과 같이 PL/SQL에서 하나의 블록(Block) 즉, 익명 블록(Anonymous Block)은 Declare, Begin, Exception, End로 구성된다. (Procedure, User Defined Function이나 Trigger의 생성 방법이나 사용 목적은 다르지만 기본적인 문법은 비슷하다)


2) DECLARE문(선언문)을 이용하여 정의되며, DECLARE문의 사용은 선택 사항이다.


3) 여기서 Block단위란 개념이 중요하다. 이 블록이란 PL/SQL문법으로 따지고 보면 Declare ~ End이다. 그리고 DECLARE은 PL/SQL 블럭의 시작을 의미이며, 변수 생성이 필요 없어 생략 시 Begin이 블럭의 시작을 의미하게 된다. 즉, Begin(Declare) ~ End 는 단순히 PL/SQL 언어에서의 블럭을 의미. 또한 중첩하여 다른 블럭을 포함할 수 있습니다.


4) 추후에 나올 IS(선언문)는 PL/SQL을 이용하여 작성되는 Procedure, User Defined Function에서 사용되는 것이며, Declare과 마찬가지로 문장의 시작을 의미하면서 동시에 변수가 선언되는 영역이다. IS가 Declare의 역할까지 대신하고 있으므로 이런 상황에서는 Declare가 오면 안 된다.


5) 변수, 상수 등을 선언하며 SQL문장 간 값을 교환 가능하다는 장점.


6) PL/SQL에서 변수 정의 시 사용되는 대입연산자는 := , 값 비교연산자는 = (Java에서의 =와 ==와 같다) 


7) if, loop 등의 절차형 언어사용으로 절차적인 프로그램이 가능하다.


8) DBMS 정의 에러 or 사용자 정의 에러를 사용 가능하다.


9) PL/SQL은 Oracle에 내장되어있어 PL/SQL과 Oracle을 지원하는 어떤 서버로도 프로그램을 옮길 수 있다.




PL/SQL 함수(Function), 프로시저(Procedure), 트리거(Trigger) 비교 한눈에 보기


사용자 정의 함수(Function)

프로시저(Procedure)

트리거(Trigger)

생성 방법

CREATE FUNCTION 문으로 생성.

CREATE PROCEDURE 문으로 생성.

CREATE TRIGGER 문으로 생성.

실행 방법

다른 프로그래밍 언어처럼 '함수 명'()으로 실행.

EXECUTE '프로시저 명'() 명령을 통해 실행.

특정 쿼리 실행 시 DB에 의해 자동 실행.

특징

프로시저처럼 SQL과 로직을 묶은 명령문. But 반드시 결과값을 return문을 사용하여 내보내줘야 한다.

BEGIN ~ END 절 내에서 COMMIT, ROLLBACK과 같은 트랜잭션 명령어(TCL)사용이 가능하다.

BEGIN ~ END 절 내에서 트랜잭션 명령어(TCL) 사용 불가능!!