순간을 성실히, 화려함보단 꾸준함을

[Oracle] DBeaver 에서는 프로시저를 어떻게 실행시킬까? 본문

나의 개발 메모장

[Oracle] DBeaver 에서는 프로시저를 어떻게 실행시킬까?

폭발토끼 2022. 11. 29. 22:32

안녕하세요.
오랜만에 찾아왔습니다.

자바와 스프링을 많이 다루고 싶지만....현재 다니고 있는 회사에서는 현실적으로 그러지 못해서 반강제적(?)으로 쿼리를 엄청 다루게 되었는데요.
사실 취업하기 전까지만 해도 쿼리란 기본적인 DDL(CREATE,DROP,ALTER) 와 DML(SELECT, UPDATE, DELETE, INSERT) 밖에 몰랐던 상태였습니다.

일하다보니 자바보단 쿼리를 훨씬 많이 다루고 눈코딩을 해야하는 상황이 많아서 기왕 이렇게 된거 PL/SQL 도 공부할겸 배우고 느낀점들을 적어보려고 합니다.

가장 힘들었던 부분이 '디버깅' 입니다.(현재 회사에서 오라클을 사용하고 있어서 양해부탁드립니다)
이클립스와 인텔리제이 같은 굉장히 좋은 IDE를 스프링과 자바를 사용함으로써 정말 편리하게 디버깅을 해왔습니다.
브레이크 포인트를 찍고 한줄씩 내려가면서 잘못된 부분들을 찾고 수정해 왔으니까요.

많은 분들이 쿼리툴로 SQL Developer 나 DBeaver 같은 툴을 사용하실텐데 SQL Developer 는 디버깅 모드가 존재하지만 안타깝게도 DBeaver는 디버깅 모드를 지원하지 않습니다.
그렇다고 SQL Developer 를 쓰자니 UI적으로 한두가지가 불편한게 아니더라구요.

그래서 오늘은 DBeaver를 사용하면서 나름(?) 저만의 방법을 소개하려고 합니다.

Q. 프로시저를 어떻게 실행시키나요?

사실 기본적인 PL/SQL 문법이지만 이제 막 SQL을 접했는데 어떻게 해야될지 정말 막막하더라구요.

케이스를 총 3가지로 나눌겁니다.

  • 파라미터 X
  • 파라미터 O -> IN 변수
  • 파라미터 X -> OUT 변수

아 참고로 DBeaver 에서 출력문을 확인하려면 (ctrl + shitf + o) 를 누르면 Output 이라는 콘솔창(?) 이 생깁니다!!

--파라미터 X
CREATE OR REPLACE PROCEDURE TEST01 AS 
    V_USER_ID varchar2(20);
BEGIN
    SELECT T1.USERID 
    INTO V_USER_ID
    FROM MEMBER T1
    WHERE T1.USERID = 'LSG';

    DBMS_OUTPUT.PUT_LINE('USER_ID : ' || V_USER_ID);
END;

위와 같은 경우는 간단합니다.

CALL TEST01();

--출력
--USER_ID : LSG

이렇게 CALL 이라는 키워드를 사용하여 프로시저를 실행시킬 수 있습니다.
BEGIN~END 구분을 사용하여 동일하게 실행 시킬 수 있습니다.
이런 프로시저를 익명 프로시저(Anonymous Procedure) 라고 합니다.

BEGIN
    TEST01();
END;

--출력
--USER_ID : LSG
--파라미터 O -> IN 변수
CREATE OR REPLACE PROCEDURE TEST02(
    IN_USER_ID IN MEMBER.USERID%TYPE
) AS 
    V_USER_ID varchar2(20);
BEGIN
    SELECT T1.USERID 
    INTO V_USER_ID
    FROM MEMBER T1
    WHERE T1.USERID = IN_USER_ID;

    DBMS_OUTPUT.PUT_LINE('USER_ID : ' || V_USER_ID);
END;

이번에는 IN 변수가 존재하는 프로시저입니다.
MEMBER.USERID%TYPE 이 문장의 뜻은 MEMBER 테이블에 존재하는 USERID 컬럼의 타입으로 IN_USER_ID 변수를 정의하겠다~ 라는 뜻입니다.

주의할점 : IN 변수를 선언해줄때 세미콜론(;)을 붙이면 안됩니다!!!

위 프로시저를 실행시켜 봅시다.

CALL TEST02('LSG');

--출력
--USER_ID : LSG

혹은

BEGIN
    TEST02(USER_ID);
END;

--출력
--USER_ID : LSG

변수를 바인딩 해서 실행시킬 수도 있습니다.

DECLARE
    I_USER_ID varchar2(20);
BEGIN
    I_USER_ID := 'LSG';    
    TEST02(I_USER_ID);
END;

--출력
--USER_ID : LSG
CREATE OR REPLACE PROCEDURE TEST03(
    IN_USER_ID IN MEMBER.USERID%TYPE,
    OUT_USER_ID OUT MEMBER.USERID%TYPE
) AS 
--    V_USER_ID varchar2(20);
BEGIN
    SELECT T1.USERID 
    INTO OUT_USER_ID
    FROM MEMBER T1
    WHERE T1.USERID = IN_USER_ID;

--    DBMS_OUTPUT.PUT_LINE('USER_ID : ' || V_USER_ID);
END;

마지막으로 OUT 변수가 있는 프로시져입니다.
OUT 변수는 익명 프로시저(Anonymous Procedure) 에서 변수를 선언하고 실행시켜야 합니다.

DECLARE
    I_USER_ID varchar2(20);
    O_USER_ID varchar2(20);
BEGIN
    I_USER_ID := 'LSG';

    TEST03(I_USER_ID,O_USER_ID);
    DBMS_OUTPUT.PUT_LINE('O_USER_ID : ' || O_USER_ID);    
END;

--출력
--O_USER_ID : LSG

잘못되거나 궁금한점 있으시면 댓글로 남겨주세요!