DBMS
[ORACLE] ( PL/SQL)오라클 프로시저(Procedure) 생성 및 실행
dev.mk
2020. 6. 30. 17:53
반응형
프로시저(Procedure) 란?
오라클에서의 프로시저는 PL/SQL을 통해 만들어진다. 자주 사용하는 SQL을 프로시저로 만든 뒤 필요 할때마다 호출,사용하여 작업 효율을 늘릴 수 있다. 함수는 특정 연산을 수행한 뒤 결과 값을 반환하지만 프로시저는 특정한 로직을 처리하기만 하고 결과 값은 반환하지 않는 서브 프로그램이다.
- 1. 파라미터 없는 형태
프로시저 생성
CREATE OR REPLACE PROCEDURE RUN_PROC
IS
RETURN_MESSAGE VARCHAR2(100) := 'http://devmg.tistory.com';
BEGIN
dbms_output.put_line(RETURN_MESSAGE);
END RUN_PROC;
프로시저 실행
EXEC RUN_PROC;
--결과
http://devmg.tistory.com
- 2. 파라미터 있는 형태
프로시저 생성
CREATE OR REPLACE PROCEDURE RUN_PROC
(
P_DEPARTMENT IN VARCHAR2, -- 변수명 IN 데이터 타입, 인수에 크기는 주지 않는다.
P_STUDENT_CNT IN NUMBER -- 변수명 IN 데이터 타입
)
IS
-- 기능구현부
P_UNIVERSITY VARCHAR2(100) := '카이스트';
BEGIN
dbms_output.put_line('인서트를 실행합니다.');
INSERT INTO UNIVERSITY_TB (UNIVERSITY, DEPARTMENT, STUDENT_CNT)
VALUES (P_UNIVERSITY, P_DEPARTMENT, P_STUDENT_CNT);
COMMIT;
END RUN_PROC;
테이블에 인서트를 하는 프로시저를 생성했다. 파라미터로 받을 값을 프로시저명 뒤에 명시해주면 되고 변수를 선언할 일이 있으면 IS뒤에다가 써주면 된다. 동작은 BEGIN뒤에 명시한다. 이 프로시저를 통해서 UNIVERSITY_TB 테이블에 데이터를 넣어보도록 하자. 위 프로시저는 예시이며 SELECT를 하는 프로시저든, UPDATE를 원하는 동작을 하는 프로시저를 만들면 된다.
프로시저 실행
EXEC RUN_PROC('전자과',200); --프로시저를 실행시킬때에는 EXEC [프로시저명] 이라고 명시한다.
-- 결과
인서트를 실행합니다.
-- 테이블 결과
UNIVERSITY DEPARTMENT STUDENT_CNT
카이스트 전자과 200
저장돤 프로시저 찾기
- 작성된 프로시저를 찾기 위해 데이터 사전을 이용할 수 있다.
※ 주의 : 데이터 사전은 대문자로 값을 저장하기 때문에 대문자로 검색한다.
1. SELECT * FROM user_objects WHERE object_type = 'PROCEDURE';
2. SELECT * FROM user_source WHERE name = '프로시저명';
OUT변수 활용하기
프로시저 생성
CREATE OR REPLACE PROCEDURE P_OUT_SAMPLE
(
P_MESSAGE OUT VARCHAR2
)
IS
BEGIN P_MESSAGE := '아웃출력';
DBMS_OUTPUT.PUT_LINE('호출 완료');
END;
프로시저 실행
--out이 있는 프로시저 호출방법
--DECLARE 로 선언되변수는 일회용
DECLARE
OUT_MESSAGE VARCHAR2(2000);
BEGIN P_OUT_SAMPLE(OUT_MESSAGE); -- 프로시저를 실행 한후에 out을 받을 변수지정
dbms_output.put_line(OUT_MESSAGE); -- 출력하기
END;
//결과
호출 완료
아웃출력
갓대희님의 프로시저 예제
CREATE OR replace PROCEDURE "SAMPLE_SET_MEMBER"
(
p_mbr_no IN VARCHAR2 ,
p_modr_no IN VARCHAR2 ,
p_mod_pgm_url IN VARCHAR2 ,
o_ret_cd OUT VARCHAR2 ,
o_ret_msg OUT VARCHAR2
)
IS
v_count NUMBER := 0;
v_sysdate DATE := SYSDATE;
user_sql_exception EXCEPTION;
BEGIN
dbms_output.Put_line('p_mbr_no '||p_mbr_no);
dbms_output.Put_line('p_modr_no '||p_modr_no);
dbms_output.Put_line('p_mod_pgm_url '||p_mod_pgm_url);
IF p_mbr_no IS NULL
OR
p_modr_no IS NULL
OR
p_mod_pgm_url IS NULL THEN
o_ret_cd := '1000';
o_ret_msg := '파라미터를 입력하세요';
RAISE user_sql_exception;
END IF;
BEGIN
SELECT count(*)
INTO v_count
FROM tmbr_mbr_bas
WHERE mbr_no = p_mbr_no;
EXCEPTION
WHEN OTHERS THEN
o_ret_cd := '2020';
o_ret_msg := '회원이 존재하지 않습니다';
RAISE user_sql_exception;
END;
BEGIN
--실제 본문 PROCEDURE
END;
o_ret_cd := '1004';
o_ret_msg := '정상적으로 처리 되었습니다';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
본문의 출처 https://coding-factory.tistory.com/453?category=758273, goddaehee.tistory.com/163
반응형