PL/SQL (19) 인기과정테이블의 일부 데이터를 추천과정 테이블로 insert하는 프로시저
create or replace PROCEDURE PR_POPULAR_MOVE_INTO_RCMD
(P_USER_NO NUMBER)
IS
CURSOR RCMD_CURSOR IS
SELECT Y.RO, SUBSTR(Y.CRS_SESS_ID,1,7) CRS_ID, Y.CRS_SESS_ID, Y.WR_DTM
FROM(
SELECT ROWNUM RO, X.*
FROM (
SELECT *
FROM TB_ST_CRS_STTS_DAY
WHERE RCMD_KIND_CD = '2'
AND WR_PER_NO = P_USER_NO
ORDER BY RCMD_DT, SORT_OR
)X
)Y
WHERE Y.RO <= 12;
V_SORT_OR NUMBER(5) := 0;
V_CRS_ID VARCHAR2(10);
V_CRS_SESS_ID VARCHAR2(20);
V_RCMD_DTM VARCHAR2(14);
V_STMT VARCHAR2(200);
V_CNT NUMBER(4);
-- BASIC LOOP 사용
BEGIN
/* 오늘 반영한 데이터가 있는지 조회 Start
동적 SQL 적용 (그룹함수 사용가능하다) */
V_STMT :=
'SELECT COUNT(CRS_ID) FROM TB_LS_CRS_RCMD
WHERE USER_NO = 15771499
AND SUBSTR(RCMD_DTM,1,8) = TO_CHAR(SYSDATE,''YYYYMMDD'')';
EXECUTE IMMEDIATE V_STMT
INTO V_CNT;
DBMS_OUTPUT.PUT_LINE('V_CNT:::'||V_CNT);
/* End */
IF V_CNT = 0 THEN
OPEN RCMD_CURSOR;
LOOP
FETCH RCMD_CURSOR INTO V_SORT_OR, V_CRS_ID, V_CRS_SESS_ID, V_RCMD_DTM;
-- EXIT의 위치는 반드시 여기로 (원하는 로직:INSERT 위)! 안그러면 Error발생한다.
-- 무결성제약조건위배 :WHY? 마지막행이 중복실행되므로
EXIT WHEN RCMD_CURSOR%NOTFOUND;
-- DBMS_OUTPUT.PUT_LINE('=============================');
-- DBMS_OUTPUT.PUT_LINE('V_SORT_OR::'|| V_SORT_OR);
-- DBMS_OUTPUT.PUT_LINE('V_CRS_ID::'|| V_CRS_ID);
-- DBMS_OUTPUT.PUT_LINE('V_CRS_SESS_ID::'|| V_CRS_SESS_ID);
-- DBMS_OUTPUT.PUT_LINE('V_RCMD_DTM::'|| V_RCMD_DTM);
-- DBMS_OUTPUT.PUT_LINE('=============================');
-- DBMS_OUTPUT.PUT_LINE('INSERT INTO TB_LS_CRS_RCMD VALUES (15771499,' || V_CRS_ID || ', 04 , 15771499,' || V_CRS_SESS_ID || ', ,' ||
V_RCMD_DTM || ', 15771499 ,' || TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') || ',2,' || V_SORT_OR || ')');
INSERT INTO TB_LS_CRS_RCMD VALUES (15771499, V_CRS_ID, '04' , 15771499 , V_CRS_SESS_ID, '', V_RCMD_DTM, 15771499,
TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'), '2', V_SORT_OR);
END LOOP;
CLOSE RCMD_CURSOR;
ELSE DBMS_OUTPUT.PUT_LINE('데이터가 이미 삽입되어있습니다.'); ROLLBACK;
END IF;
COMMIT; -- 예외처리 전에 반드시 커밋을해야한다.
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error Number: ' ||SQLERRM);
ROLLBACK;
END;
출처: https://sourceflower.tistory.com/43?category=608037 [소스플로우]
'Database > Oracle PLSQL' 카테고리의 다른 글
PL/SQL(23) 오라클 스키마 정보 확인 (0) | 2019.04.04 |
---|---|
PL/SQL (22) 사용자 정의 예외(User-Defined Exceptions) (0) | 2019.04.04 |
PL/SQL (21) AUTHID , PRAGMA , parallel enable 힌트, deterministic (0) | 2019.04.04 |
PL/SQL (20) 패키지 Package (1) (0) | 2019.04.04 |
PL/SQL (18) REF CURSOR, 동적쿼리 (예제 완벽 x) (0) | 2019.04.04 |
PL/SQL (17) 동적 SQL개념 및 예제 (0) | 2019.04.04 |
PL/SQL (16) EXCEPTION 및 예제 (0) | 2019.04.04 |
PL/SQL (15) PL/SQL 정리 및 예제 (0) | 2019.04.04 |