-
[ORACLE] ( PL/SQL)오라클 프로시저(Procedure) 생성 및 실행DBMS 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
반응형'DBMS' 카테고리의 다른 글
[ORACLE] ORA-01422: exact fetch returns more than requested number of rows (0) 2020.12.18 [ORACLE] 오라클 에러 ORA-00984: column not allowed here (0) 2020.12.15 [ORACLE] (PL/SQL) 오라클 반복문 (LOOP, WHILE, FOR) (0) 2020.06.30 [ORACLE] (PL/SQL) 오라클 조건문 (IF, CASE)문 사용방법 (0) 2020.06.30 [ORACLE] (PL/SQL) 오라클 변수, 상수 선언하기 (0) 2020.06.30