SYS_REFCURSOR 를 이용한 PLSQL 사용법 0 2 2,312

by 열심히 [PL/SQL] [2014.05.29 11:46:44]


프로그램에서 선택된행만큼 루프돌면서
      -- 선택된 행
   ------------------------
    USER_NO  USER_NM  TYPE
    ------------------------
    001    홍길동  A
    002    이순신  A
    003    강감찬  S
    004    임꺽정  A
 

USER_NO 로 테이블A 에서 체크한후

없으면
   인서트하고 이런 구조로 P_RST 에 담고
   --------------------------------------------------------------
    USER_NO   YN  GUBUN  DUP_NO  DUP_CNT(DUP_NO의 카운트)
    --------------------------------------------------------------
    001     Y   A    NYLL   0
    002     Y   A    NYLL   0
있으면
   이런 구조로 P_RST 에 담고
   --------------------------------------------------------------
    USER_NO   YN  GUBUN  DUP_NO  DUP_CNT(DUP_NO의 카운트)
    --------------------------------------------------------------
    001     Y   A    NYLL   0
    002     Y   A    NYLL   0

   루프빠져나오고 종료

최종적으로
P_RST 에 담은것을 리턴해주고 싶습니다.
처음 프로시져 해보는거라 구문이나... 어떤 객체나 이런걸 잘모르겠네요.
검색해보니
클라이언트 프로그램에 결과를 넘겨줄수있는게 SYS_REFCURSOR 이 커서더라구요.

아래 프로시져를 만들긴 했으나. 잘못된구문 또는 어떻게 결과를 담아서 보내줘야할지
모르는 부분이 있습니다.
이런경우 어떻게 처리 하는지 알려주시면 고맙겠습니다.


CREATE OR REPLACE PROCEDURE SP_TEST
(
 P_TYPE   IN VARCHAR2,    -- 'A'
 P_USER_NO  IN VARCHAR2,    -- '001^002^003^004'       선택된행의 값을 한번에 보내기 위해 스트링 문자열로
 P_USER_NM  IN VARCHAR2,    -- '홍길동^이순신^강감찬^임꺽정' 선택된행의 값을 한번에 보내기 위해 스트링 문자열로
 P_RST    OUT SYS_REFCURSOR  -- 프로그램에 결과를 던져줄 커서
)
IS

 V_USER_NO  테이블A.USER_NO%TYPE;
 V_DUP_NO  VARCHAR2(10 BYTE);
 V_GUBUN   VARCHAR2(1 BYTE);
 V_CHK_CNT  NUMBER;

-- 아래 스플릿함수는 '001^002^003^004' 문자열을 잘라서 테이블로우로 만들주는 함수입니다.
-- 루프돌리기위해 사용했습니다. 소스는 따로 기술하지않았습니다.

 CURSOR C_CUR IS
     SELECT X.COL_VAL
     FROM TABLE(스플릿함수(P_USER_NO), '^')) X

BEGIN

 OPEN C_CUR;
 
 LOOP
 
   FETCH C_CUR INTO V_USER_NO;
   EXIT WHEN C_CUR%NOTFOUND;
   
   BEGIN
   
    V_CHK_CNT := 0;
    
    SELECT DUP_NO,GUBUN,COUNT(*) OVER() CHK_CNT INTO V_DUP_NO,V_GUBUN,V_CHK_CNT
    FROM
    (
     SELECT '100' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL
     SELECT '200' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL
     SELECT '300' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL
     SELECT '600' DUP_NO, '004' USER_NO, 'A' GUBUN FROM DUAL UNION ALL
     SELECT '900' DUP_NO, '005' USER_NO, 'B' GUBUN FROM DUAL
    )
    WHERE USER_NO = V_USER_NO
    
    IF V_CHK_CNT = 0 THEN
      --선택된 행들을 인서트.
      INSERT INTO 테이블A
      (
        USER_NO
       ,USER_NM
       ,USER_TYPE
      )
      VALUES
      (
        --V_USER_NO  이걸넣으면 될것 같은데. 잘모르겠네요
       ,--P_USER_NM  여기에 있는 이름들을 넣어줘야 하는데.. 구문을 모르겠습니다^^;;
       ,--P_TYPE         동일.
      
      );
      
      -- 이부분에 V_CHK_CNT = 0 인경우니 코딩해서 P_RST 에 담을수있는 무언가의 처리를 해줘야 할것 같은데
      -- 모르겠습니다 ^^;;
    
      COMMIT;
      
    ELSE

      -- 이부분에 V_CHK_CNT > 0 인경우니 코딩해서 P_RST 에 담을수있는 무언가의 처리를 해줘야 할것 같은데
      -- 모르겠습니다 ^^;;


       --건수가 없으면 루프빠져나가고 프로시져 바로 종료
       EXIT;
      
    END IF;
   END;
 END LOOP;
 
 CLOSE C_CUR;
 
OPEN P_RST FOR  ????;    -- ???? 이부분을 저위에서 담은것으로 어떻게 ???? 여기 넣어서 결과를 리턴할지도 모르겠습니다.

END SP_TEST_PROC;  


 

by DarkBee [2014.05.29 14:28:14]
따로 프로시저 만들필욘 없을듯

WITH t AS
(
    SELECT '100' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL 
    SELECT '200' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL 
    SELECT '300' DUP_NO, '003' USER_NO, 'A' GUBUN FROM DUAL UNION ALL 
    SELECT '600' DUP_NO, '004' USER_NO, 'A' GUBUN FROM DUAL UNION ALL 
    SELECT '900' DUP_NO, '005' USER_NO, 'B' GUBUN FROM DUAL 
)
SELECT * 
  FROM (
        SELECT REGEXP_SUBSTR ( col1, '[^\^]+', 1, lv ) user_no
             , REGEXP_SUBSTR ( col2, '[^\^]+', 1, lv ) user_nm
          FROM (
                   SELECT '001^002^003^004' col1
                        , '홍길동^이순신^강감찬^임꺽정' col2
                   , LEVEL lv FROM DUAL B 
                  CONNECT BY LEVEL <= REGEXP_COUNT ( '001^002^003^004', '[\^]' ) + 1
           ) a
   ) a
 WHERE NOT EXISTS ( SELECT 'X' 
                      FROM t
                     WHERE t.user_no = a.user_no
                  )

 


by 손님 [2014.05.29 20:02:14]
아 감사합니다^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입