Dev/SQL

[오라클 SQL] 프로시저 생성/CREATE PROCEDURE / 예외 선언

Aloner 2022. 7. 8. 17:36
728x90
반응형

소스 코드

CREATE OR REPLACE PROCEDURE TEST_PROC
(
	IN_PARAM1 IN VARCHAR2,
    IN_PARAM2 IN VARCHAR2
)
IS
V_DATA1 TABLE_NM.COLUMN_NM%TYPE;
V_CNT NUMBER;

PARAMETER_NULL EXCEPTION;
NO_SELECT EXCEPTION;

BEGIN

IF (IN_PARAM1 IS NULL OR IN_PARAM2 IS NULL) THEN
	RAISE PARAMETER_NULL;
END IF;

	SELECT COUNT(*) INTO V_CNT FROM TABLE_NM WHERE COLUMN_NM = '조건';
    
IF V_CNT <= 0 THEN
	RAISE NO_SELECT;
END IF;

	INSERT INTO TABLE_NM VALUES('1', '2', '3');
    DBMS_OUTPUT.PUT_LINE('INSERT COMPLETE');

EXCEPTION
	WHEN PARAMETER_NULL THEN
    	DBMS_OUTPUT.PUT_LINE('PARAMETER IS NULL');
    	ROLLBACK;
    WHEN NO_SELECT THEN
    	DBMS_OUTPUT.PUT_LINE('데이터가 없습니다.');
    	ROLLBACK;
    WHEN OTHERS THEN
    	DBMS_OUTPUT.PUT_LINE('에러 발생');
    	ROLLBACK;
END;

최근에 만들었던 프로시저를 샘플로 만든 코드입니다.

인서트 프로시저 샘플이고 대략적인 코드 설명하겠습니다.

코드 설명

CREATE OR REPLACE PROCEDURE TEST_PROC
(
	IN_PARAM1 IN VARCHAR2,
    IN_PARAM2 IN VARCHAR2
)

파라미터를 설정하는 부분은 프로시저명 뒤에 괄호()를 추가해서 설정할 수 있습니다. 파라미터가 없다면 괄호를 생략할 수 있습니다.

인풋 파라미터는 파라미터 명, IN/OUT타입, 데이터타입 이렇게 3가지로 설정할 수 있습니다.

프로시저 내의 변수는 IS 다음 선언합니다.

IS
V_DATA1 TABLE_NM.COLUMN_NM%TYPE;
V_CNT NUMBER;

PARAMETER_NULL EXCEPTION;
NO_SELECT EXCEPTION;

변수명 데이터타입; 형식으로 선언하며 실제 테이블의 컬럼 형식을 그대로 적용하고 싶다면 테이블명.컬럼명%TYPE 을 사용하면 됩니다.

예외부를 사용자 정의로 설정할 땐 사용자 정의 예외명을 설정해야 합니다.

예외명 EXCEPTION; 으로 정의하면 됩니다.

BEGIN 뒤로는 프로시저의 로직을 정의하면 됩니다.

이 부분에서 언제 사용자 정의 예외가 실행되야 하는지 정의하시면 됩니다.

SELECT, INSERT 등의 데이터 조작 언어도 이 부분에서 사용됩니다.

IF (IN_PARAM1 IS NULL OR IN_PARAM2 IS NULL) THEN
	RAISE PARAMETER_NULL;
END IF;

RAISE 예외선언 명; 이 코드가 사용자 정의 예외를 실행하는 코드입니다.

SELECT COUNT(*) INTO V_CNT FROM TABLE_NM WHERE COLUMN_NM = '조건';

SELECT INTO는 추출한 데이터를 변수에 저장하는 문법입니다.

DBMS_OUTPUT.PUT_LINE('INSERT COMPLETE');

프로시저가 실행됨에 따라 로그를 볼 땐 DBMS_OUTPUT 기능을 사용하면 로그를 볼 수 있습니다.

EXCEPTION
	WHEN PARAMETER_NULL THEN
    	DBMS_OUTPUT.PUT_LINE('PARAMETER IS NULL');
    	ROLLBACK;
    WHEN NO_SELECT THEN
    	DBMS_OUTPUT.PUT_LINE('데이터가 없습니다.');
    	ROLLBACK;
    WHEN OTHERS THEN
    	DBMS_OUTPUT.PUT_LINE('에러 발생');
    	ROLLBACK;

예외가 발생했을 때의 로직을 정하는 부분입니다.

사용자 정의 예외를 만들지 않았다면 맨 밑의 OTHERS 만 사용해도 예외처리를 할 수 있습니다.

728x90
반응형