[답변]다이나믹 sql로 커서 선언.. 0 0 2,653

by 백해현 [2006.10.23 11:32:15]


전에 답변 달아 드렸는데... 응용을 못하시네요. 내용을 이리저리 해볼 생각은 안해 보십니까?

 

 

CREATE OR REPLACE PROCEDURE 프로시져명 (

  pSLIP_DATE      IN        SLIP_M.SLIP_DATE%TYPE,            /* 전표일자        */
          
) IS

  vCURSOR_ID                INTEGER;
  vDUMMY                    INTEGER;
  vAMOUNT                   NUMBER;

  v_DynamicSQL            VARCHAR2(1000);


BEGIN

    v_DynamicSQL = ' SELECT SUM(CR_AMT) FROM SLIP_M WHERE SLIP_DATE = :slip_date ' ;
              

    --[ Cursor내의 Block ]
    BEGIN
   
      --[ 처리를 위해 Cursor를 Open ]
      vCURSOR_ID := DBMS_SQL.OPEN_CURSOR;
   
     
      --[ Query를 Parse한다 ] -> 이부분이 Dynamic SQL 들어갈 부분
      DBMS_SQL.PARSE(vCURSOR_ID, v_DynamicSQL, DBMS_SQL.NATIVE);
   
     
      --[ 입력변수를 묶는다 ] - 입력변수 없으면 생략
      DBMS_SQL.BIND_VARIABLE(vCURSOR_ID, ':SLIP_DATE', pSLIP_DATE);
   
     
      --[ 출력변수를 정의한다 ]
      --[ 출력변수 지정시 char이면 자리수도 지정해주어야 합니다. ]

      DBMS_SQL.DEFINE_COLUMN(vCURSOR_ID, 1, vAMOUNT );
       
      --[ 문장을 실행한다 ]
      vDUMMY := DBMS_SQL.EXECUTE(vCURSOR_ID);
   
     
      --[ 인출 Loop ]
      LOOP
     
            --[ 행을 버퍼로 인출하고 Exit조건을 검사한다 ]
            IF DBMS_SQL.FETCH_ROWS(vCURSOR_ID) = 0 THEN
               EXIT;
            END IF;
           
            --[ 버퍼에서 PL/SQL 변수로 행들을 검색한다 ]
            DBMS_SQL.COLUMN_VALUE(vCURSOR_ID, 1, vAMOUNT );
   
     
      END LOOP;


      --[ Cursor를 닫는다 ]
      DBMS_SQL.CLOSE_CURSOR(vCURSOR_ID);

     
    --[ 예외 처리부 ]
    EXCEPTION

      WHEN OTHERS THEN
           DBMS_SQL.CLOSE_CURSOR(vCURSOR_ID);

    END;  
 
 
  --[ Commit ]
  COMMIT WORK;
                
                  
END 프로시져명;                
       

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입