여행을 개발하다

Oracle PL/SQL 입문 본문

데이터베이스/Oracle PL SQL

Oracle PL/SQL 입문

yhtragramming 2020. 1. 13. 17:05

이제 막 시작한 오라클 PL/SQL에 대한 공부 내용을 공유해보고자 한다.

 

데이터베이스의 레코드를 정확하게 CRUD(SELECT, INSERT, UPDATE, DELETE) 하는 것은, 데이터 정합성 등을 유지하기 위해서 매우 중요하다.

 

하지만 데이터베이스 상에서도 위와 같은 CRUD 작업을 단순 반복 한다던가, 명확한 RULE을 가지고 절차에 따라 실행되어야 하는 일련의 작업들이 있다면 이를 프로그램화 시키는 것이 보다 효율적일 수 있다.

 

물론, JAVA 같은 프로그래밍 언어의 for문이나 while문을 이용하는 것도 하나의 방법이다. 그러나 SQL 문법과 상호 연동할 수 있는 '어떤' 것이 있다면, 그것은 강력한 툴이 될 수 있다. 이러한 니즈에서 시작한 것이 PL/SQL이라고 생각한다.

 

PL/SQL은 단순 SQL에 더해 프로그래밍 기능을 제공하여, 응용 프로그램의 효율성을 높인다. 단, ORACLE에서만 통용되는 문법이기 때문에 다른 DBMS(Tibero DB 제외, 일부 function은 안될수도...)와의 호환이 어렵다는 것이 단점이다.

 

그렇다고 해서 다른 DBMS에 프로그래밍 기능이 아예 없다?는 것은 아니다. 마이크로소프트 사의 MS-SQL은 트랜잭트 SQL, PostgreSQL에는 PL/postgreSQL이 ORACLE의 PL/SQL과 동일한 기능을 하기 때문이다.이런점에서, DBMS가 하나의 프로그래밍 언어라고 하면, PL/SQL이 그 언어만의 문법라도 봐도 무방할 듯 싶다. (물론 SQL 그 자체도 JOIN 방식 등엔 DBMS별 차이가 있다)

 

그렇다면 PL/SQL은 무엇이고, 어떤 내부적인 구조를 가지고 있는지 살펴본다.

 

1. PL/SQL의 정의

- PL/SQL 은Oracle’s Procedural Language extension to SQL의 약자 이다.

- SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며, 오라클 자체에 내장되어 있는 Procedure Language 이다.

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

- PL/SQL 문은 블록 구조로 되어 있고 PL/SQL자신이 컴파일 엔진을 가지고 있다.

 

참고 웹사이트 :http://www.gurubee.net/lecture/1039(꿈꾸는 개발자, DBA 커뮤니티 구루비)

 

 

다시 말해, 사용자가 지정한 순서대로 실행이 되며, 그 실행 단위를'블록(block)'이라고 부른다. 또한, 자체적 컴파일 엔진에서프로그래밍 된 부분(PL/SQL ENGINE에서 처리), SQL(SQL Statement Executor에서 처리)을 분리하여 실행시킨다. (PL/SQL ENGINE의 처리 로직의 구조는 아래 그림 참고)

출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26744176(구루비 지식창고)

 

그렇다면 Block이란 무엇일까?

 

2. Block이란?

- PL/SQL은 프로그램을 논리적인 블록으로 나누는 구조화 된 블록 언어 이다.

- PL/SQL 블록은 선언부(선택적), 실행부(필수적), 예외 처리부(선택적)로 구성되어 있고, BEGIN과 END 키워드는 반드시 기술해 주어야 한다.

- PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있다.

참고 웹사이트 :http://www.gurubee.net/lecture/1039(꿈꾸는 개발자, DBA 커뮤니티 구루비)

 

 

Block에는 하나의 블록에서 사용할 변수들을 선언하는 '선언부', 실행될 내용을 적어주는 '실행부', 발생가능한 예외를 처리하는 '예외부'로 이루어져 있다.선언부의 시작은 'DECLARE', 실행부의 시작은 'BEGIN'으로 명시해주며, 마지막 'END'를 사용하여 1개의 블록단위를 끝맺는다.

Block은 선언부, 실행부, 예외부로 이루어져 있다.

이중, 선언부가 끝나는 시점이자 실행부가 실행되기 전에는 반드시 'BEGIN'이라는 키워드를 적어줘야 하고, 예외처리부가 끝나는 시점이자 블록이 종료되는 시점에는 반드시 'END'로 마감을 해주어야 한다.

'BEGIN ~ END;' 구문으로 PL/SQL의 시작과 끝을 명시한다.

그러나 선언부나 예외부는 선택사항이기 때문에, 사용자 필요에 따라서 입력해도 되고 혹은 그렇지 않아도 된다.

Block의 필수요소와 선택적 요소

 

3. 예제

PL/SQL과 Block에 대한 구조를 살펴봤다면, 이제는 이를 이용한 간단한 예제를 살펴본다.

 

프로그래밍 언어를 배우기 시작할 때, 교과서처럼 따라 나오는 것은 아무래도 'Hello, Language~'를 화면상에 출력해보는 것이다. Python은 print()였고, Java는 System.out.print()/System.out.println()이었다. Oracle PL/SQL은 다음과 같이 출력한다.

DBMS_OUTPUT.PUT_LINE('내용');

 

모든 언어가 마찬가지겠지만, string 형태를 출력하기 위해서는 '(작은따옴표)로 내용을 묶어준다. 필수요소인 BEGIN과 END를 명시하고, 선언부에 출력하고 싶은 내용을 작성하여 출력해본다.

BEGIN 
  DBMS_OUTPUT.PUT_LINE('INTRODUCTION TO ORACLE PL/SQL');
END;

다음과 같이 실행 결과가 나타난다.

 

선언부에서 변수를 대입하고 출력해볼 수도 있다. 참고로, 선언부에서 변수를 선언할 때는 다음과 같은 형식을 따른다.

 

DECLARE 변수명 변수타입;
DECLARE V_VAR NUMBER;

 

처음부터 변수에 값을 넣어서 선언할 수도 있다.

DECLARE 변수명 변수타입 := 값;
DECLARE V_VAR NUMBER := 2;

 

'V_VAR'에 값 '2'를 넣어서 화면에 출력해본다.

DECLARE V_VAR NUMBER := 2;
  BEGIN DBMS_OUTPUT.PUT_LINE('V_VAR=' || V_VAR); 
END;

 

 

4. Block의 유형

Block은 위에서 언급한대로 선언부, 실행부, 예외 처리부로 이루어져 있다. 또한, Block이 어떤 기능을 하는가에 따라 여러가지 세부 유형으로 나뉠 수 있다. ('[]' 안의 내용은 optional)

* Anonymous Block (익명 블록)

-이름이 없는 블록을 의미 하며, 실행하기 위해 프로그램 안에서 선언 되고 실행시에 실행을 위해 PL/SQL 엔진으로 전달 된다.

- 선행 컴파일러 프로그램과 SQL*Plus 또는 서버 관리자에서 익명의 블록을 내장 할 수 있다.

-- Anonymous Block

[DECLARE]

BEGIN

[EXCEPTION]

END;

* Procedure (프로시저)

- 특정 작업을 수행할수 있는 이름이 있는 PL/SQL 블록으로서, 매개 변수를 받을수 있고, 반복적으로 사용할수 있다.

- 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL블록을 데이터베이스에 저장하기 위해 생성 한다.

-- Procedure 

PROCEDURE procedure_name IS 

BEGIN

[EXCEPTION]

END;

* Function (함수)

- 보통 값을 계산하고 결과값을 반환하기 위해서 함수를 많이 사용 한다.

- 대부분 구성이 프로시저와 유사하지만 IN 파라미터만 사용 할 수 있고, 반드시 반환 될 값의 데이터 타입을 RETURN문에 선언해야 한다.

- 또한 PL/SQL블록 내에서 RETURN문을 통해서 반드시 값을 반환 해야 한다.

-- Function 

FUNCTION function_name RETURN data_type IS 

BEGIN 
   RETURN value; 
   
[EXCEPTION] 

END;

 

익명 블록은 대부분 일회성으로 사용되는데 반해, 프로시저나 함수는 '저장 블록'으로도 불리는만큼 서버에 저장되어 지속적으로 사용된다. '저장 블록'인 프로시저와 함수는 내용에는 큰 차이가 없지만, 결과값을 내뱉는가 혹은 그렇지 않는가에 차이가 있다.결국, 위에서 예제로 들었던 모든 블록은 '익명 블록'이라고 볼 수 있다.

 

참고 웹사이트 :http://www.gurubee.net/lecture/1343(꿈꾸는 개발자, DBA 커뮤니티 구루비)

 

 

지금까지 PL/SQL의 개요에 대해 알아보았다. '구루비 커뮤니티의 커리큘럼'을 따라 지속적으로 학습할 예정이다.

 

감사합니다!! : )

 

'데이터베이스 > Oracle PL SQL' 카테고리의 다른 글

함수 (Function)  (0) 2020.01.28
프로시저 (Procedure)  (0) 2020.01.19
Comments