😀저장 프로시져(Stored Procedure: Procedure)


 - 특정 결과를 산출할 수 있는 모듈을 작성하고 컴파일하여 서버의 프로시져캐쉬에 저장
   하여 사용
 - 모든 응용프로그램에서 사용할 수 있도록 캡슐화 기능제공 =>일관성 제공
 - 데이터베이스 내부 구조에 대한 보안성 제공
 - 프로시져는 반환 값이 없음

(사용형식)
  CREATE [OR REPLACE] PROCEDURE 프로시져명[( 
    매개변수 [IN|OUT|INOUT] 데이터타입[:=디폴트 값], --IN 프로시져 밖에서 안으로,OUT 안에서 밖으로 INOUT 둘다가능/ 생략하면 IN
            :
    매개변수 [IN|OUT|INOUT] 데이터타입[:=디폴트 값]) --데이터타입은 타입명만 입력하고 크기는 입력하지 않는다
  IS|AS --DECLARE랑 똑같음
    선언영역
  BEGIN
    실행영역
  END;

✔수행예) 직무코드,직무명,최대급여,최소급여를 입력 받아 HR계정의 JOBS테이블에 신규 데이터를
              삽입하는 프로시져를 작성하시오. --다른계정에서 만들 수 없음

 CREATE OR REPLACE PROCEDURE insert_jobs_proc(
    p_job_id IN HR.JOBS.JOB_ID%TYPE,--매개변수는 보통 P를 사용하는게 일반적
    p_job_title IN HR.JOBS.JOB_TITLE%TYPE,
    p_misal IN NUMBER, 
    p_mxsal IN NUMBER)
  IS
  
  BEGIN
   INSERT INTO HR.JOBS VALUES( p_job_id,p_job_title,p_misal,p_mxsal);
   COMMIT;
  END;

[프로시져의 실행]
 1. 독립적 실행
  - OUT 매개변수를 사용하지 않은 경우
    EXEC|EXECUTE 프로시져명(매개변수list);
 2. PL/SQL의 블록에서 실행   
  - OUT 매개변수를 사용한 경우 - OUT매개변수에 의해 전달되는 값을 보관항 변수를 사용
    프로시져명(매개변수list)

 EXECUTE insert_jobs_proc('sample1','SAMPLE JOB TITLE',3000,5000);

✔사용예)직무코드를 입력받아 해당 자료를 JOBS테이블에서 삭제하는 프로시져 작성

 CREATE OR REPLACE PROCEDURE delete_jobs_proc(
    p_job_id IN JOBS.JOB_ID%TYPE)
   IS
    L_CNT NUMBER:=0;   
   BEGIN
     SELECT COUNT(*) INTO L_CNT
       FROM HR.JOBS
      WHERE JOB_ID=p_job_id;
      
      IF L_CNT!=0 THEN
         DELETE FROM HR.JOBS WHERE JOB_ID=p_job_id;
      ELSE
         DBMS_OUTPUT.PUT_LINE('해당자료가 테이블에 없습니다..');
      END IF;
      COMMIT;
   END;
   
   EXEC delete_jobs_proc('sample1');

✔사용예)오늘이 2020년 7월 28일 이라고 가정하고 매출정보를 장바구니에 저장하는 프로시져를
                작성하시오. 입력 값은 회원번호,오늘날짜,상품코드,수량이다

  CREATE OR REPLACE PROCEDURE delete_jobs_proc(
    p_job_id IN JOBS.JOB_ID%TYPE)
  IS  
    L_CNT NUMBER:=0;
  BEGIN
    SELECT COUNT(*) INTO L_CNT
      FROM HR.JOBS
     WHERE JOB_ID=p_job_id;
    
    IF L_CNT!=0 THEN
       DELETE FROM HR.JOBS WHERE JOB_ID=p_job_id;
    ELSE
       DBMS_OUTPUT.PUT_LINE('해당자료가 테이블에 없습니다..');
    END IF;
    COMMIT;
  END;
      
      
  EXEC delete_jobs_proc('sample1');

✔사용예) 오늘이 2020년 7월 28일리라고 가정하고 매출정보를 장바구니에 저장하는 프로시져를
                작성하시오. 입력 값은 회원번호,오늘날짜,상품코드,수량이다

CREATE OR REPLACE PROCEDURE delete_jobs_proc(
    p_job_id IN JOBS.JOB_ID%TYPE)
  IS  
    L_CNT NUMBER:=0;
  BEGIN
    SELECT COUNT(*) INTO L_CNT
      FROM HR.JOBS
     WHERE JOB_ID=p_job_id;
    
    IF L_CNT!=0 THEN
       DELETE FROM HR.JOBS WHERE JOB_ID=p_job_id;
    ELSE
       DBMS_OUTPUT.PUT_LINE('해당자료가 테이블에 없습니다..');
    END IF;
    COMMIT;
  END;
      
      
  EXEC  delete_jobs_proc('sample1');

✔사용예)오늘이 2020년 7월 28일리라고 가정하고 매출정보를 장바구니에 저장하는 프로시져를
              작성하시오. 입력 값은 회원번호,오늘날짜,상품코드,수량이다

 CREATE OR REPLACE PROCEDURE insert_cart_proc(
    p_mid IN MEMBER.MEM_ID%TYPE,
    p_date IN DATE,
    p_pid IN PROD.PROD_ID%TYPE,
    p_qty IN NUMBER)
  IS 
    L_CART_NO CART.CART_NO%TYPE;
    L_FLAG CHAR(9):=TO_CHAR(p_date,'YYYYMMDD')||'%';
    L_CNT NUMBER:=0;
  BEGIN
    SELECT COUNT(*) INTO L_CNT
      FROM CART
     WHERE CART_NO LIKE L_FLAG;
    
    IF L_CNT=0 THEN 
       L_CART_NO:=TO_CHAR(p_date,'YYYYMMDD')||TRIM('00001');
    ELSE 
       SELECT MAX(CART_NO)+1 INTO L_CART_NO
         FROM CART
        WHERE CART_NO LIKE L_FLAG; 
    END IF;
    
    INSERT INTO CART VALUES(p_mid,L_CART_NO,p_pid,p_qty);
    COMMIT;
  END;
      
  EXECUTE  insert_cart_proc('a001',TO_DATE('20200728'),'P201000008',5);

 

'ORACLE 복습 & 정리' 카테고리의 다른 글

[ORACLE] 트리거 221202-02  (0) 2022.12.02
[ORACLE] 함수 221202-01  (0) 2022.12.02
[ORACLE] 반복문 221201-03  (0) 2022.12.01
[ORACLE] 분기명령 221201-02  (0) 2022.12.01
[ORACLE] 커서(CURSOR) 2221201-01  (0) 2022.12.01

+ Recent posts