goto 문을 쓰지 않다고 어디서 쓴것을 보고 예제를 만들어 봤는대요
제가 생각한것과 다른 결과가 나와서 질문 드립니다.
0으로 나누기 때문에 에러가 날것이고 GOTO error_end; 로 가게 했습니다.
근대 <[[ ucess_end ]] 블럭도 실행이 되는게 이해가 안 갑니다.
실패 일때는 [[ error_end ]] 여기민 성공이면 [[ sucess_end]] 여기만 가게 하려면 어떻게 해야 하나요? 할수는 있는건가요???
DECLARE
out1 varchar2(7000);
out2 varchar2(7000);
BEGIN
TEST1('C1234', out1, out2);
dbms_output.put_line(out1 || ':' ||out2);
END ;
CREATE OR REPLACE PROCEDURE C##SCOTT.TEST1
(
PEMPNM IN VARCHAR2 ,
O_MSG1 OUT VARCHAR2,
O_retmsg OUT VARCHAR2
)
IS
V_EMPNO NUMBER ;
update_cnt VARCHAR2(700) := NULL; --메시지없음
BEGIN
O_MSG1 := NULL;
SELECT NVL(MAX(EMPNO),0) + 1 INTO V_EMPNO FROM EMP ;
DBMS_OUTPUT.PUT_LINE('EMPNO:'|| V_EMPNO);
BEGIN
INSERT INTO EMP
(
EMPNO
,ENAME
)
VALUES
(
V_EMPNO/0 -- 오루 밠애
,PEMPNM
);
EXCEPTION
WHEN OTHERS THEN
O_MSG1 := 'insert err [' || SQLCODE || '] ' || SQLERRM || $$PLSQL_LINE;
O_retmsg := 'eeee' ;
GOTO error_end;
end;
update_cnt := SQL%ROWCOUNT;
IF SQL%ROWCOUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('update_cnt:'||update_cnt);
goto sucess_end;
ELSE
DBMS_OUTPUT.PUT_LINE('update_cnt:'||update_cnt);
END IF;
O_retmsg := V_EMPNO;
[[error_end]]
DBMS_OUTPUT.PUT_LINE('__ error_end 111111 : '|| to_char(sysdate,'YYYYMMDDHH24MISS'));
DBMS_OUTPUT.PUT_LINE('__ error_end 222222 : '|| to_char(sysdate,'YYYYMMDDHH24MISS'));
ROLLBACK;
[[sucess_end]]
DBMS_OUTPUT.PUT_LINE('__ error_end 333333 : '|| to_char(sysdate,'YYYYMMDDHH24MISS'));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
BEGIN
O_MSG1 := 'ERR_MST[' || SQLCODE || '] ' || SQLERRM || $$PLSQL_LINE;
O_retmsg := 'eeee222222' ;
END;
END test1;
https://velog.io/@aljongjong/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%ED%95%84%EA%B8%B0-%EC%A0%95%EB%A6%AC
https://m.blog.naver.com/wook2124/222102990691