오라클 프로시저 goto문 질문 입니다. 0 2 2,094

by 유환 [Oracle 기초] goto [2023.10.30 22:51:24]


새 폴더.zip (33,938Bytes)

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

by 마농 [2023.10.31 00:42:20]

"블럭"이라는 표현을 쓰셨지만.
"블럭"에 해당 하는 범위 설정 같은 것은 없습니다.
"블럭"이 아니라 "라인"이라는 표현이 적당합니다.
해당 라인으로 이동을 한 것 뿐입니다.
해당 라인 부터 아래로 쭈욱 실행이 되는 것입니다.

원하시는 부분에 대해서는
가능한 방법이 상당히 다양해서 일일이 다 열거할 수는 없을 것 같구요.
개인적인 의견으로는
IF문 등으로 충분히 제어가 가능한데
굳이 goto 문을 쓸 필요가 있는가? 하는 생각이 듭니다.


by 유환 [2023.10.31 10:11:06]

아..라인으로 가서 그 밑으로 다 실행 되서 그런군요.

그럼 sucess_end 부분에서 뭔가 if문 처리를 해야 겠네요. 감사합니다.

제가 만든건 아니고 기존 소스에 goto문을 쓴것을 보고 분석하다 이해를 하려고 질문 드렷습니다.

감사합니다.

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