투케이2K

165. (Oracle/오라클) 프로시저 (PROCEDURE) - 특정 부서 데이터 조회 , 삽입 , 수정 , 삭제 수행 본문

OracleDB

165. (Oracle/오라클) 프로시저 (PROCEDURE) - 특정 부서 데이터 조회 , 삽입 , 수정 , 삭제 수행

투케이2K 2022. 5. 10. 15:13

[개발 환경 설정]

개발 툴 : Toad

개발 언어 : Oracle

 

[소스 코드]

/************************************************************/
CREATE OR REPLACE PROCEDURE PRO_TEST_DEPT 
(
  I_GUBUN         IN VARCHAR, -- [필수 : 1 = 특정 조회 / 2 = 삽입 / 3 = 수정 / 4 = 삭제 / 5 = 전체 조회]
  I_IDX           IN VARCHAR, -- [필수 : 인덱스 값 / 전체 조회 일 경우 0 값]
  I_DEPT_NAME     IN VARCHAR, -- [부서 이름]
  I_DEPT_CHANNER  IN VARCHAR, -- [채널]  
                                                                                             
  O_MSG           OUT VARCHAR, -- [리턴 : 메시지]
  O_CURSOR        OUT SYS_REFCURSOR -- [리턴 : 테이블]
)
                                               
/*************************************************************
[설 명] - 특정 부서 조회 , 수정 , 삽입 , 삭제 수행
-------------------------------------------------------------
[리 턴] - Y : MESSAGE / N : MESSAGE
-------------------------------------------------------------

[프로시져 호출]


-- [특정 부서 조회 실시]
EXEC PRO_TEST_DEPT('1', '1', '테스트부서', '1234567', :AA, :BB);


-- [특정 부서 삽입 실시]
EXEC PRO_TEST_DEPT('2', '1', '테스트부서', '1234567', :AA, :BB);


-- [특정 부서 수정 실시]
EXEC PRO_TEST_DEPT('3', '1', '테스트부서', '12345678', :AA, :BB);


-- [특정 부서 삭제 실시]
EXEC PRO_TEST_DEPT('4', '1', '테스트부서', '1234567', :AA, :BB);


-- [전체 부서 조회 실시 : 인덱스 값 하드 코딩 [0]]
EXEC PRO_TEST_DEPT('5', '0', '', '', :AA, :BB);

-------------------------------------------------------------
              
[프로시져 삭제]

DROP PROCEDURE PRO_TEST_DEPT;
              
**************************************************************/


--AS --선택
IS --선택


/******************* [전역변수 생성 및 초기화] *******************/

M_DEBUG  VARCHAR2 (100); -- [디버깅 단계]

M_DATE   VARCHAR2 (100); -- [현재 날짜 및 시간]

M_COUNT  INTEGER; -- [매핑되는 조건 카운트]


/***************** [메인부분 시작 및 커서생성] *******************/
BEGIN


   /*=======================================================*/
   
   
   -- [디버깅 단계 지정]
   M_DEBUG := '1';
   
   
   -- [현재 날짜 및 시간 데이터 지정]
   M_DATE := TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'); 
   
   /*
   DBMS_OUTPUT.PUT_LINE(''); 
   DBMS_OUTPUT.PUT_LINE('=============================');     
   DBMS_OUTPUT.PUT_LINE('[PRO_TEST_DEPT] : [' || M_DEBUG || '] : ' || M_COUNT);
   DBMS_OUTPUT.PUT_LINE('M_DATE : ' || M_DATE );
   DBMS_OUTPUT.PUT_LINE('=============================');
   DBMS_OUTPUT.PUT_LINE(''); 
   --*/
   
   /*=======================================================*/
   
   
   -- [디버깅 단계 지정]
   M_DEBUG := '2'; 
   
   
   -- [필수 인풋 데이터 널 체크 실시]
   IF I_GUBUN IS NULL OR I_GUBUN = ''
      OR I_IDX IS NULL OR I_IDX = '' 
   THEN 
      BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '인풋 데이터 값을 다시 확인해주세요. [I_GUBUN] [I_IDX]' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
          SELECT '' AS "DATA_TABLE" 
            FROM DUAL; 
      END;
    
      -- [프로시져 종료]
      RETURN; 
   END IF;
   
   
   /*=======================================================*/
   
   
   -- [디버깅 단계 지정]
   M_DEBUG := '3'; 
   
   
   /*
   DBMS_OUTPUT.PUT_LINE(''); 
   DBMS_OUTPUT.PUT_LINE('=============================');     
   DBMS_OUTPUT.PUT_LINE('[PRO_TEST_DEPT] : [' || M_DEBUG || '] : ' || M_COUNT);
   DBMS_OUTPUT.PUT_LINE('I_GUBUN : ' || TRIM(I_GUBUN) );
   DBMS_OUTPUT.PUT_LINE('=============================');
   DBMS_OUTPUT.PUT_LINE(''); 
   --*/
   
   
   -- [인풋으로 들어온 구분 값 확인 실시]
   IF TRIM(I_GUBUN) = '1' THEN -- [특정 조회]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-1';
      
      
      -- [인풋값으로 들어온 조건으로 검색 되는 데이터가 있는지 확인]
      SELECT COUNT(*) INTO M_COUNT
          FROM TEST_DEPT
      WHERE TRIM(DEPT_IDX) = TRIM(I_IDX)
      ;
      
      
      -- [카운트 값 확인 실시]
      IF M_COUNT > 0 THEN -- [검색된 데이터가 있는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-1-1';
         
         BEGIN
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT DEPT_IDX AS 순서 ,
                   DEPT_NAME AS 부서이름 ,
                   DEPT_CHANNER AS 채널 ,
                   DEPT_UPDT AS 수정일자
              FROM TEST_DEPT
            WHERE TRIM(DEPT_IDX) = TRIM(I_IDX);
               
          -- [리턴 메시지 삽입]        
          O_MSG := 'Y : ' || '특정 데이터 조회를 완료했습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']';      
         END;
         
         -- [프로시져 종료]
         RETURN;
         
      ELSE -- [검색된 데이터가 없는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-1-2';
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '검색 조건을 만족하는 데이터가 없습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
    
         -- [프로시져 종료]
         RETURN;
         
      END IF;
      
   /*=================================*/
      
   ELSIF TRIM(I_GUBUN) = '2' THEN -- [삽입]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-2'; 
      
      
      -- [인풋값으로 들어온 조건으로 검색 되는 데이터가 있는지 확인]
      SELECT COUNT(*) INTO M_COUNT
          FROM TEST_DEPT
      WHERE TRIM(DEPT_IDX) = TRIM(I_IDX)
      ;
      
      
      -- [카운트 값 확인 실시]
      IF M_COUNT > 0 THEN -- [검색된 데이터가 있는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-2-1';
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '이미 등록된 데이터가 있습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
    
         -- [프로시져 종료]
         RETURN;
         
      ELSE -- [검색된 데이터가 없는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-2-2';
         
         BEGIN
          -- [데이터 삽입 실시]
          INSERT INTO TEST_DEPT (DEPT_IDX, DEPT_NAME, DEPT_CHANNER, DEPT_UPDT) 
             VALUES (I_IDX, I_DEPT_NAME, I_DEPT_CHANNER, M_DATE);
         END;
         
         -- [커밋 수행]
         COMMIT;
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'Y : ' || '데이터 삽입을 완료했습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
         
         -- [프로시져 종료]
         RETURN;
      END IF;
      
   /*=================================*/
      
   ELSIF TRIM(I_GUBUN) = '3' THEN -- [수정]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-3'; 
      
      
      -- [인풋값으로 들어온 조건으로 검색 되는 데이터가 있는지 확인]
      SELECT COUNT(*) INTO M_COUNT
          FROM TEST_DEPT
      WHERE TRIM(DEPT_IDX) = TRIM(I_IDX)
      ;
      
      
      -- [카운트 값 확인 실시]
      IF M_COUNT > 0 THEN -- [검색된 데이터가 있는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-3-1';
         
         BEGIN
          -- [데이터 수정 실시]
          UPDATE TEST_DEPT 
              SET DEPT_NAME = I_DEPT_NAME , DEPT_CHANNER = I_DEPT_CHANNER , DEPT_UPDT = M_DATE
          WHERE TRIM(DEPT_IDX) = TRIM(I_IDX);
         END;
         
         -- [커밋 수행]
         COMMIT;
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'Y : ' || '데이터 수정을 완료했습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
         
         -- [프로시져 종료]
         RETURN;
         
      ELSE -- [검색된 데이터가 없는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-3-2';
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '수정 조건을 만족하는 데이터가 없습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
    
         -- [프로시져 종료]
         RETURN;
         
      END IF;
   
   /*=================================*/   
      
   ELSIF TRIM(I_GUBUN) = '4' THEN -- [삭제]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-4'; 
      
      
      -- [인풋값으로 들어온 조건으로 검색 되는 데이터가 있는지 확인]
      SELECT COUNT(*) INTO M_COUNT
          FROM TEST_DEPT
      WHERE TRIM(DEPT_IDX) = TRIM(I_IDX)
      ;
      
      
      -- [카운트 값 확인 실시]
      IF M_COUNT > 0 THEN -- [검색된 데이터가 있는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-4-1';
         
         BEGIN
          -- [데이터 수정 실시]
          DELETE FROM TEST_DEPT 
              WHERE TRIM(DEPT_IDX) = TRIM(I_IDX);
         END;
         
         -- [커밋 수행]
         COMMIT;
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'Y : ' || '데이터 삭제를 완료했습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
         
         -- [프로시져 종료]
         RETURN;
         
      ELSE -- [검색된 데이터가 없는 경우]
      
         -- [디버깅 단계 지정]
         M_DEBUG := '3-4-2';
         
         BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '삭제 조건을 만족하는 데이터가 없습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
            SELECT '' AS "DATA_TABLE" 
               FROM DUAL; 
         END;
    
         -- [프로시져 종료]
         RETURN;
         
      END IF;
   
   /*=================================*/
   
   ELSIF TRIM(I_GUBUN) = '5' THEN -- [전체 조회]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-5';
      
      BEGIN
       -- [리턴 테이블]
       OPEN O_CURSOR FOR 
       SELECT DEPT_IDX AS 순서 ,
              DEPT_NAME AS 부서이름 ,
              DEPT_CHANNER AS 채널 ,
              DEPT_UPDT AS 수정일자
          FROM TEST_DEPT
       ORDER BY TO_NUMBER(DEPT_IDX) ASC;
               
       -- [리턴 메시지 삽입]        
       O_MSG := 'Y : ' || '전체 데이터 조회를 완료했습니다.' || ' [M_DEBUG : '|| M_DEBUG ||']';      
      END;
         
      -- [프로시져 종료]
      RETURN;
   
   /*=================================*/
      
   ELSE -- [정의 되지 않은 구분 값]
   
      -- [디버깅 단계 지정]
      M_DEBUG := '3-6';
      
      BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || '구분 값을 다시 확인해주세요.' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
          SELECT '' AS "DATA_TABLE" 
            FROM DUAL; 
      END;
    
      -- [프로시져 종료]
      RETURN; 
      
   END IF;        
   
   
   /*=======================================================*/
   
   
/***************** [예외 발생 처리 수행 부분] ******************/
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      BEGIN
          -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || 'EXCEPTION : NO_DATA_FOUND' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
          SELECT '' AS "DATA_TABLE" 
            FROM DUAL;
      END;

   WHEN OTHERS
   THEN
      BEGIN
         -- [리턴 메시지 삽입]        
          O_MSG := 'N : ' || 'EXCEPTION : OTHERS' || ' [M_DEBUG : '|| M_DEBUG ||']'; 
          
          -- [리턴 테이블]
          OPEN O_CURSOR FOR 
          SELECT '' AS "DATA_TABLE" 
            FROM DUAL;
      END;

      
/****************** [프로시저 종료 완료 부분] ******************/
END PRO_TEST_DEPT;
/
/***********************************************************/

 

[결과 출력]


 

반응형
Comments