프로그램에서 선택된행만큼 루프돌면서
-- 선택된 행
------------------------
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;
따로 프로시저 만들필욘 없을듯 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 )