pl/sql DBMS_OUTPUT.PUT_LINE질문... 0 5 6,582

by 신혜정 DBMS_OUTPUT.PUT_LINE pl/sql [2012.10.17 19:08:25]



아래의 procedure를 실행시키면  server output 이  아래 두개만 나옵니다. 

procedure에 문제가 있는건지요~  

고수님들 문제가 뭔지 부탁드립니다....



 DBMS_OUTPUT.PUT_LINE( '데이터 삭제 성공 ' );
DBMS_OUTPUT.PUT_LINE('SP_TM_DN_LOG PROCEDURE INSERT TIME : ' || v_sys_date);




CREATE OR REPLACE PROCEDURE TMS21.SP_TM_DN_LOG
IS

v_sys_date varchar2(20);
v_exists_check integer;
v_error_check integer;

BEGIN

    DBMS_OUTPUT.ENABLE ;

    SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') INTO v_sys_date FROM DUAL;
   
    DBMS_OUTPUT.PUT_LINE('SP_TM_DN_LOG PROCEDURE START TIME : ' || v_sys_date);

    v_error_check := 0;


    DELETE FROM TB_CAMPAIGN_CUSTOMER_DN
    WHERE START_TIME BETWEEN TO_DATE(TO_CHAR(SYSDATE-1, 'YYYY/MM/DD') || '00:00:00', 'YYYY/MM/DD HH24:MI:SS')
   AND TO_DATE(TO_CHAR(SYSDATE-1, 'YYYY/MM/DD') || '23:59:59', 'YYYY/MM/DD HH24:MI:SS');

    --COMMIT;
    DBMS_OUTPUT.PUT_LINE( '데이터 삭제 성공 ' );
   

    SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') INTO v_sys_date FROM DUAL;
   
    DBMS_OUTPUT.PUT_LINE('SP_TM_DN_LOG PROCEDURE INSERT TIME : ' || v_sys_date);


    INSERT INTO TB_CAMPAIGN_CUSTOMER_DN (
    DPS_NO
    , C_SEQ
    , CAMPAIGN_SEQ
    , DN_TM
    , DN_DM
    , DN_SMS
    , START_TIME
    , DPS_CK_DT
    )
    SELECT
    DPS_NO
    , C.C_SEQ
    , C.CAMPAIGN_SEQ
    , DN_TM
    , DN_DM
    , DN_SMS
    , start_time
    , SYSDATE
    FROM TMS21.TB_CAMPAIGN_CUSTOMER C
    INNER JOIN (SELECT DISTINCT C_SEQ, CAMPAIGN_SEQ, START_TIME
    FROM TB_CAMPAIGN_CUSTOMER_LOG
    WHERE START_TIME
    BETWEEN TO_DATE(TO_CHAR(SYSDATE-1, 'YYYY/MM/DD') || '00:00:00', 'YYYY/MM/DD HH24:MI:SS')
    AND TO_DATE(TO_CHAR(SYSDATE-1, 'YYYY/MM/DD') || '23:59:59', 'YYYY/MM/DD HH24:MI:SS')
    GROUP BY C_SEQ, CAMPAIGN_SEQ, START_TIME ) l
    ON C.C_SEQ = L.C_SEQ AND C.CAMPAIGN_SEQ = L.CAMPAIGN_SEQ
    WHERE 1=1
    AND (DPS_NO IS NOT NULL OR DPS_NO <> '')
    AND (DN_TM='Y' OR DN_DM='Y' OR DN_SMS='Y')
    ORDER BY 1, 2,3;


    EXCEPTION
    WHEN  DUP_VAL_ON_INDEX  THEN
    DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX : ㅣLINE 중복 발생...ROLLBACK');
    v_error_check := 1;
    ROLLBACK;
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND  : DID NOT INSERT ....');
    v_error_check := 2;
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('ETC ERROR :  ...ROLLBACK' );
    v_error_check :=1;

    COMMIT;
   
   
    SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') INTO v_sys_date FROM DUAL;
   
    DBMS_OUTPUT.PUT_LINE('SP_TM_DN_LOG PROCEDURE END TIME : ' || v_sys_date);
   
    IF v_error_check = 0 THEN
    DBMS_OUTPUT.PUT_LINE('PROCEDURE SUCCESS....COMMIT');
    ELSE
    DBMS_OUTPUT.PUT_LINE('PROCEDURE FAIL.......ROLLBACK');
    END IF;


END SP_TM_DN_LOG;

by 부쉬맨 [2012.10.17 19:16:44]
별문제없어보입니다.

DBMS_OUTPUT.PUT_LINE('SP_TM_DN_LOG PROCEDURE END TIME : ' || v_sys_date);
여부분 강제로 한번 위치값을 한번주시고 위에께나오는건지 
아래께 나오는건지
확인하시고요.

 IF v_error_check = 0 THEN
    DBMS_OUTPUT.PUT_LINE('PROCEDURE SUCCESS....COMMIT');
    ELSE
    DBMS_OUTPUT.PUT_LINE('PROCEDURE FAIL.......ROLLBACK');
    END IF;

마지막에 이부분

if  
v_error_check  =0 then
    DBMS_OUTPUT.PUT_LINE('PROCEDURE SUCCESS....COMMIT');
end if;


if v_error_check  0 then
    DBMS_OUTPUT.PUT_LINE('PROCEDURE FAIL.......ROLLBACK');
end if;

바꿔보세요
저두 예전에 저런식의 else를 하니 안먹었던기억이...


by 마농 [2012.10.17 19:58:46]

PL/SQL 블럭에 대한 이해가 부족하시네요.
1. PL/SQL 블럭에 대한 이해
PL/SQL 은 블럭구조로 이루어 집니다.
하나의 블럭은 DECLARE BEGIN EXCEPTION END 로 이루어 지며
DECLARE 와 EXCEPTION 은 생략 가능하며 BEGIN END 는 필수입니다.
단 블럭 자체가 아닌 프로시져나 펑션의 경우 IS 구문이 DECLARE 를 대신합니다.
하나의 블럭은 다른 하나의 블럭을 내포할 수 있습니다.
단 블럭과 블럭이 서로 교차되어 겹쳐질수는 없겠지요.
- PL/SQL 강좌 : http://www.gurubee.net/oracle/plsql
2. 위 구문의 문제점
단일 블럭으로 모든걸 처리하려고 하네요.
위처럼 하시려면 서브블럭을 이용해 처리하셔야 합니다.


by 마농 [2012.10.17 20:01:01]

Insert 구문 앞에 Begin 절 추가
commit 구문 앞에 End; 절 추가
이렇게 추가한 begin 에서부터 End 까지가 하나의 서브블럭이 되는 구조.


by 신혜정 [2012.10.18 10:00:32]

저도 블럭 처리 부분의 문제가 아닐까 의심했습니다.

oracle procedure 입문자라 ...

어드바이스 감사 드립니다.


by 부쉬맨 [2012.10.18 10:09:44]
자세히보니깐 
표현해주고싶으신부분이
다 exception부분에있군요..

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