본문 바로가기
Database/oracle

[oracle] PL_SQL 기본틀, 반복 FOR ..IN LOOP 기본

by 평범한kiki 2023. 4. 17.

1. 오라클 PL_SQL 기본 틀

DECLARE OR

CREATE OR REPLACE PROCEDURE PL_SQL명

...변수 선언

BEGIN

... 내용

        --내용안에 에러처리(try~catch 처럼 처리 할수 있다)

         BEGIN

         ....내용

         EXCEPTION WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE('V_STR :: '||SQLCODE||'-'||SQLERRM);  

         END;

 EXCEPTION

      WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('ERROR');
          DBMS_OUTPUT.PUT_LINE('V_STR :: '||SQLCODE||'-'||SQLERRM);   

END;

 

2. 오라클 반복 FOR ..IN LOOP 기본 틀

FOR CUR IN (

   SELECT 문

)

LOOP

    CUR.EMP //이런식으로 select 한 내용 접근가능

END LOOP;

 

SET SERVEROUTPUT ON;  //로그찍게 해준다

DECLARE
  I_RCV_NO VARCHAR2(100) := '';
  I_FN_NO VARCHAR2(100) := '';
 
  O_RSLT_CD VARCHAR2(100) := '';
  O_RSLT_MSG VARCHAR2(100) := '';
  V_MSGCNT NUMBER := 0;
  V_RSLT_CD VARCHAR2(2) ;
  V_RSLT_MSG VARCHAR2(4000) ;
  ERROR EXCEPTION;
  TYPE TY_NEST IS TABLE OF ARCHAR2(5);
  NEST Y_NEST;
BEGIN
   NEST := TY_NEST('192',193',194');
   FOR RE_LIST IN(
        SELECT 'P' SB_NM, '0000' SB_TNO FROM DUAL
        UNION ALL
        SELECT 'L' SB_NM, '0001' SB_TNO FROM DUAL   
   )
   LOOP
       I_RCV_NO := RE_LIST.SB_NM;

       FOR I IN NEST.FIRST..NEST.LAST
       LOOP
            I_FN_NO := NEST(I);
           BEGIN
               DBMS_OUTPUT.PUT_LINE('WWW');     
           EXCEPTION 
           WHEN OTHERS THEN
                V_RSLT_CD := 'E';
                V_RSLT_MSG := 'ERROR_'||SQLERRM;
                RAISE ERROR;  //바깥 exception으로 간다 
           END;
        END LOOP;
   END LOOP;
 EXCEPTION 
       WHEN ERROR THEN
          O_RSLT_CD := V_RSLT_CD;
          O_RSLT_MSG :=   V_RSLT_MSG;
          DBMS_OUTPUT.PUT_LINE('ERROR');
          DBMS_OUTPUT.PUT_LINE(O_RSLT_CD);   
       WHEN OTHERS THEN
           O_RSLT_CD := V_RSLT_CD;
           O_RSLT_MSG :=   V_RSLT_MSG;
           DBMS_OUTPUT.PUT_LINE('OTHER ERROR');
          DBMS_OUTPUT.PUT_LINE(O_RSLT_CD);  
 END;