ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    반응형

    댓글

Designed by Tistory.