본문 바로가기
IT/Oracle

오라클 PL/SQL 기본 구문, 프로시저 디버깅

by heavenLake 2023. 7. 26.
반응형

 PL/SQL 블록 구조

 
DECLARE 
 -- 선언부(옵션)
 -- 변수나 상수를 정의
 
BEGIN
 -- 실행부(필수, BEGIN-END)
 -- 로직 수행(일반 SQL문, 조건문, 반복문 등)
 
    EXCEPTION
     -- 예외처리부(옵션)
     -- 로직 수행중 에러 발생 시 예외 사항 처리

END;

 

 

오라클 PL/SQL 작성시 기본 구문정리, 프로시저등을 바로 생성하지 않고 다음과 같이 테스트 후 생성하면 된다.

 

    DECLARE 
	    
	    M_NAME  VARCHAR2(50) := '투케이'; --초기 변수 선언 
	    
	    --특정테이블의 컬럼타입을 변수에 지정하기.
	  --V_ENAME 테이블명.컬럼명%TYPE;   
	   
	    OUT_MSG VARCHAR2(50); 
	   
	    NUM NUMBER:=11; 
  	    
	    v_num NUMBER:=0;
	     
	    -- 사용자정의 EXCEPTION 선언
	    NUM_CHECKER EXCEPTION; 

	    -- 커서 등록
	    CURSOR C_TMP1 IS   
		    SELECT 'TEST1' AS COL FROM DUAL UNION ALL
		    SELECT 'TEST2' FROM DUAL UNION ALL
		    SELECT 'TEST3' FROM DUAL 
			;
	    
    BEGIN
		DBMS_OUTPUT.PUT_LINE('=========초기변수값===============');     
		DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력 
       
		
		DBMS_OUTPUT.PUT_LINE('=========변수에 값 직접대입===============');     
		M_NAME := 'xxx'; --변수에 값 대입 실시
		DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력 
		
		
		DBMS_OUTPUT.PUT_LINE('==========변수에 SELECT 값 대입===================');    
		SELECT '탈옥 투게더' AS s
		  INTO M_NAME 
		  FROM dual;
		 
		DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력
	    
	
		DBMS_OUTPUT.PUT_LINE('============LOOP문 과 EXIT(BREAK) =================');    
	    LOOP 
	        DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num); 
	        v_num := v_num + 1;  
	        EXIT WHEN v_num > 3;		
		END LOOP;
		 
		
		DBMS_OUTPUT.PUT_LINE('============FOR LOOP문 과 EXIT(BREAK) =================');     
        
		FOR i in 1..10 LOOP	
		  	if mod(i, 2) = 0 then
				dbms_output.put_line( i || '는 짝수!!');	
			else
				dbms_output.put_line( i || '는 홀수!!');
			end if;
			EXIT WHEN i >= 4; --4이상이면 LOOP를 종료 시키다. 
		END LOOP;
	 
		
		DBMS_OUTPUT.PUT_LINE('==== DECLARE에 CURSOR 선언후 LOOP, 사용 후 반드시 커서를 CLOSE해야한다. ======'); 
		FOR REC IN C_TMP1
		LOOP
		    DBMS_OUTPUT.PUT_LINE(REC.COL);               
		END LOOP;
	    
	    CLOSE C_TMP1;  /* ★★★★  커서는 반드시 CLOSE로 닫아줘야한다.   ★★★★  */ 
	
	
		DBMS_OUTPUT.PUT_LINE('=== DECLARE에 CURSOR 선언없이 안에서 LOOP, 이경우 묵시적으로 커서가 자동 CLOSE된다. ====');     
		FOR RECV_DTL IN (   
						    SELECT 'TEST1' AS COL FROM DUAL UNION ALL
						    SELECT 'TEST2' FROM DUAL UNION ALL
						    SELECT 'TEST3' FROM DUAL 
					    )
         LOOP
		    DBMS_OUTPUT.PUT_LINE(RECV_DTL.COL);          
         END LOOP;
         
         
		 DBMS_OUTPUT.PUT_LINE('============EXCEPTION 처리================='); 
	
		 NUM:=2;
    
		 BEGIN  /* EXCEPTION 처리 구역 BEGIN ~ END 테스트용 */
				
		         IF NUM > 10 THEN -- EXCEPTION 조건 설정
				    DBMS_OUTPUT.PUT_LINE('EXCEPTION 호출'); 
				    RAISE NUM_CHECKER; -- EXCEPTION 호출 - NO2이 호출 됨
				 END IF;
				 DBMS_OUTPUT.PUT_LINE('NO1'); 
				
	 			 --RAISE NO_DATA_FOUND; -- NO_DATA_FOUND : 조회된 데이터가 없을때 나는 EXCEPTION 예약어 (EXCEPTION 호출 - NO3이 호출 됨)
	
	 			 --RAISE SELF_IS_NULL; -- OTHERS 확인용 호출 (EXCEPTION 호출 - NO7이 호출 됨) 
	 			                     -- 밑에 EXCEPTION에 없으면 계속 상위로 올라가면서 호출된다. 
	 			                     -- SELF_IS_NULL :  인스턴스가 초기화되지 않았을 경우 호출 되는 예약어
	
		        
				  /* ★★★★  EXCEPTION 처리는 바로 상위 BEGIN END안에서 일어난 EXCEPTION 내에서 처리된다. 
				   *       만약 해당 EXCEPTION 처리가 없으면 상위 BEGIN 으로 계속 이동 호출 함.
				   *       EXCEPTION WHEN안에 구문을 블럭처리 할 수 없기때문에(??), EXCEPTION WHEN 이후 평소문을 쓸수 없음. 
				   *       예외처리가 된 상위 BEGIN이 END가 끝나야 펑소문 사용가능.                  ★★★★  */
				  EXCEPTION  
				    WHEN NUM_CHECKER THEN -- 사용자 정의 EXCEPTION
				        DBMS_OUTPUT.PUT_LINE('NO2'); 
				        OUT_MSG := '10이 넘어갑니다!';
				        RETURN;   --RETURN:프로시저 종료, RETURN이 없을 경우 쿼리를 계속 수행함 (RETURN이없는 경우 NO5~~가 실행됨) 
				    WHEN NO_DATA_FOUND THEN  -- OHTER은 조건에 맞는 경우가 없을 경우 
				        DBMS_OUTPUT.PUT_LINE('NO3'); 
				        OUT_MSG := 'OHTER 확인용!';
				        --RETURN; --RETURN:프로시저 종료, RETURN이 없을 경우 쿼리를 계속 수행함 (RETURN이없는 경우 NO4, NO5~~가 실행됨) 
				     
			       DBMS_OUTPUT.PUT_LINE('NO4'); 
		 END; 
	  
	     DBMS_OUTPUT.PUT_LINE('NO5'); 
		 OUT_MSG := '프로시저 수행 완료!';
		 DBMS_OUTPUT.PUT_LINE(OUT_MSG);
		
		 EXCEPTION   
		 	WHEN OTHERS THEN  -- OHTER은 조건에 맞는 경우가 없을 경우 
				DBMS_OUTPUT.PUT_LINE('NO7'); 
		 
    END;

 

 

반응형

댓글