programming language/Oracle(오라클)

[Oracle (오라클)] PL/SQL - 1 : 소개, 기초 & 커서 사용 및 장단점

공대키메라 2023. 1. 27. 17:20

최근에 회사에서 pl/sql을 많이 사용하고 있다.

 

이번 글에서는 pl/sql이란 무엇인지, 그리고 장단점이 무엇인지 간단하게 알아보고자 한다.

 

* 참고한 사이트 및 사진의 출처

- https://ko.wikipedia.org/wiki/PL/SQL

- https://www.google.com/imgres?imgurl=https%3A%2F%2Fpbs.twimg.com%2Fprofile_images%2F1558677096611737601%2FHOLFWgAh_400x400.jpg&imgrefurl=https%3A%2F%2Ftwitter.com%2F3_chan_04&tbnid=UknFM8HvJvlxbM&vet=12ahUKEwip0v-_pef8AhWZEKYKHWTKDw0QMygAegUIARDNAQ..i&docid=R5uDFWLI6xRMUM&w=335&h=335&q=%EA%BA%84%EC%95%85&ved=2ahUKEwip0v-_pef8AhWZEKYKHWTKDw0QMygAegUIARDNAQ

 

1. PL/SQL이란?

위키 피디아에서 어떻게 pl/sql을 소개하는지 간단하게 알아보자.

 

PL/SQL(피엘에스큐엘)은 상용 관계형 데이터베이스 시스템인 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나이다.

 

여기서 PL/SQL은 PROCEDUAL LANGUAGE/SQL의 약자이다. 절차지향적 언어와 구조화 질의어의 짬뽕!

가슴이 웅장해진다...

 

그냥 일반적으로 가장 많이 사용하는 JAVA 언어 쓰듯이 우리 db에서도 프로그래밍이 가능하다는 것이다.

 

2. PL/SQL 기본 - 선언, 구조 설명

이게 뭐고, 이게 뭐고 설명하는거보다는 바로 보는것이 이해에 더 빠를거라고 생각된다.

 

사실 어떻게 쓰느지만 바로 보는게 훨씬 직관적이라고 생각한다.

 

DECLARE                                 -- PL/SQL 시작 선언(DECLARE)문
    V_TEST1 VARCHAR2(50);               -- 변수 선언하기 : VARCHAR2 TYPE
    V_TEST2 VARCHAR2(50) := '세팅하기'; -- 변수 선언하기 : 선언과 동시에 값 할당
    V_NUMBER NUMBER := 1;             
    V_RESULT VARCHAR2(100);
    V_CURSOR SYS_REFCURSOR;      -- 커서 선언.
                              -- 특정 SQL 문장을 처리한 결과를 담고있는 
                              -- 메모리 영역을 가리키는 일종의 포인터
    V_TEST VARCHAR2(50);
    EXCEPTION_MSG EXCEPTION;  -- 에러도 다음과 같이 변수로 선언 가능.
BEGIN
    IF V_NUMBER = 1 THEN              -- PL/SQL에서는 조건문을
       V_RESULT := '1';               -- IF, ELSIF, ELSE, ENDIF; 순으로 사용한다.
    ELSIF V_NUMBER = 2 THEN
       V_RESULT := '2';               -- 변수에 할당하기 위해서는 ':=' 기호를 사용해야 한다.
    ELSE
       V_RESULT := 'ERROR';
       RAISE EXCEPTION_MSG;           -- java 에서 throw Exception하듯이 에러를 발생시킬수 잇음
    END IF;
    DBMS_OUTPUT.PUT_LINE('-------------- V_RESULT ----------------');
    DBMS_OUTPUT.PUT_LINE('V_RESULT :: ' || V_RESULT); -- java에서 System.out.println과 유사.
    DBMS_OUTPUT.PUT_LINE('-------------- V_CURSOR --------------');
    
    OPEN V_CURSOR               -- 커서를 배열이라고 생각하면 편하다.
     FOR SELECT 'TEST' AS TEST  -- 방식 : OPEN '커서명' FOR '내가 담을 데이터';
           FROM DUAL 
         UNION ALL 
         SELECT 'TEST1' AS TEST 
           FROM DUAL
       ;
      
     LOOP FETCH V_CURSOR       -- 커서에서 데이터를 꺼내는 법
           INTO V_TEST;        -- LOOP FETCH '커서명' INTO ~~
                               -- 커서가 담은 데이터의 갯수만큼 변수를 선언해줌.
                               -- 현재는 위에서 조회한 데이터 컬럼이 하나라서 하나임. 
           EXIT WHEN V_CURSOR%NOTFOUND; -- 데이터가 없으면 LOOP를 나간다.
           DBMS_OUTPUT.PUT_LINE('V_TEST :: ' || V_TEST);
     END LOOP;
    EXCEPTION 
        WHEN EXCEPTION_MSG THEN
          DBMS_OUTPUT.PUT_LINE('ERROR OCCUR!!');
END;

 

위의 코드를 실행하면 OUTPUT 내역을 다음과 같이 확인할 수 있다.

 

실행 결과

 

3. PL/SQL 장단점

필자가 pl/sql을 작성하면서 몸소 느낀 장점들은 다음과 같다.

장점

 

1. connection 낭비가 없다.

 

일반적으로 java 에서 db에 접근하고자 하면  connection 을 생성해야 한다.

 

때로는 이 connection비용이 매우 비쌀때가 있다. PL/SQL을 사용하면 DB에서 직접 모든 작업이 이루어지기에

 

java 로직 내에서 여러번 DB에 다녀올 필요 없이 한 번에 딱! 원하는 데이터를 조회하고, 정리해서 전달 모든것이 가능하다. 그러면 속도는 기존사용법과 비교해서 빠를것이다. 

 

 

2. 다시 배포하는 번거로움이 없다.

 

예를 들어, spring으로 만든 웹사이트를 서비스한다고 하자. 

 

그러면 정식 런칭까치 수많은 배포 과정이 필요할 것이다.

 

하지만, pl/sql의 경우에는 크게 걱정할 필요가 없다.

 

우리가 서비스중인 db에 직접 접근해서, 바꾼다고 해서 다시 배포를 하지는 않을 것이다. 

 

단점

물론 장점만 있는 것은 아니다. 이것도 경험에 빗대어 설명하도록 하겠다.

 

 

1. 비효율적인 로직 구성 방식

 

로깅 기능은 어딜가나 모든 개발자들이 신경써서 사용하는 기능중 하나라고 생각한다.

 

그러면 여기 pl/sql에서 logging처리를 하려면 어떻게 해야 하나? 물론 작성된 모든 pl/sql에 일일이 작성해줘야 한다!

 

중복되는 코드에 대해서 별도의 package를 db에서 생성해서 pl/sql을 잘 작성할 수는 있다. 

 

그런데 말입니다... java 의 다형성 혹은 spring 의 aop같은 기능은 전혀 구현할 수 없으며 pl/sql간의 상속 기능도 존재하지 않는다. 말 그대로 절차지향적(PROCEDURAL LANGUAGE/ sql )인 것이다!(꺄악!)

 

꺄악!

 

정신이 아찔해진다. 정말.

 

필자는 실제로 DB에 log 데이터를 넣는다는데 일일이 모든 곳에 적용해야하는 나 자신의 모습을 보고 까무러치고 말았다.

 

 

2. DB중심의 개발이 만들어낸 비효율적인 개발

 

2번의 내용도 1번 내용과 일맥 상통한 내용같다.

 

sql에만 특화된 사람이 pl/sql을 사용한다면 굉장히 좋아할 것이다. 

 

하지만 PostgreSql의 경우에는 계속해서 다양한 기능을 만들어 내기위해 많은 시도를 하는 편인것 같지만,

설령 그렇다 할지라도 여전히 sql을 로직으로 다루는 것은 곤욕일 수밖에 없다.

 

예를 들어, java 의 경우에는 여러 Collection Framework를 제공하는데 굉장히 데이터를 핸들링하기 편하다.

 

물론 DB에서도 그런 작업들이 전부 가능하지만 훨씬 정성이 많이 들어갈 뿐더러 SQL은 초심자들에게 결코 쉽지 않다.

 


이렇게 오늘 pl/sql의 사용법 그리고 필자가 느낀 장단점에 대해 소개했다.

 

인터넷에 장,단점 검색하면 많은 내용이 나오는데 그것도 궁금하면 그것을 보면 될 것이다. 

 

다음에는 Oracle을 이용해서 좀 더 다양하게 pl/sql에서 데이터를 핸들링하는 방법을 소개하려고 한다.