복붙노트

[SQL] MySQL은 - 어떻게 저장 프로 시저에서 / 종료를 종료합니다

SQL

MySQL은 - 어떻게 저장 프로 시저에서 / 종료를 종료합니다

나는 아주 간단한 질문이 있습니다하지만 난 MySQL을 사용 SP를 종료에 대한 간단한 코드를 얻을 did't. 나와 함께 누구나 공유는 어떻게 할 할 수 있습니까?

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NULL THEN
          #Exit this stored procedure here
     END IF;

     #proceed the code
END;

해결법

  1. ==============================

    1.

    CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
    proc_label:BEGIN
         IF tablename IS NULL THEN
              LEAVE proc_label;
         END IF;
    
         #proceed the code
    END;
    
  2. ==============================

    2.이 같은 논리 부분으로 절차를 헤어, (그것은 MySQL의 라벨 쿵푸를 사용하지 않기 때문에 즉 모든 데이터베이스에서 작동) 휴대용 방법으로이 상황을 처리하려면 :

    이 같은 논리 부분으로 절차를 헤어, (그것은 MySQL의 라벨 쿵푸를 사용하지 않기 때문에 즉 모든 데이터베이스에서 작동) 휴대용 방법으로이 상황을 처리하려면 :

    CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
    BEGIN
         IF tablename IS NOT NULL THEN
             CALL SP_Reporting_2(tablename);
         END IF;
    END;
    
    CREATE PROCEDURE SP_Reporting_2(IN tablename VARCHAR(20))
    BEGIN
         #proceed with code
    END;
    
  3. ==============================

    3.당신이 오류가 없었다있는 상황에 대해 "조기 종료"를 원한다면, @piotrm에 의해 게시 허용 대답을 사용합니다. 가장 일반적으로, 그러나, 당신은 (특히 SQL 프로 시저에) 오류 상태로 인해 구제 될 것입니다.

    당신이 오류가 없었다있는 상황에 대해 "조기 종료"를 원한다면, @piotrm에 의해 게시 허용 대답을 사용합니다. 가장 일반적으로, 그러나, 당신은 (특히 SQL 프로 시저에) 오류 상태로 인해 구제 될 것입니다.

    MySQL의 버전 5.5의로서 당신은 예외를 던질 수 있습니다. 동일한 결과를 달성하는 것 등의 예외 처리기를 무효화하지만 더 깔끔하고 통렬한하게된다.

    방법은 다음과 같습니다

    DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000';
    
    IF <Some Error Condition> THEN      
        SIGNAL CUSTOM_EXCEPTION
        SET MESSAGE_TEXT = 'Your Custom Error Message';
    END IF;     
    

    참고 SQLSTATE '45000'은 "처리되지 않은 사용자 정의 예외 상황"동일합니다. 기본적으로이 (같은 의미를 가지고있는) 1644의 오류 코드를 생성합니다. 당신이 (예외 처리 플러스 추가 세부 사항) 원하는 경우 다른 조건 코드 또는 오류 코드를 던질 수 있습니다.

    이 주제에 대한 자세한 내용은 체크 아웃 :

    https://dev.mysql.com/doc/refman/5.5/en/signal.html

    어떻게 MySQL의 함수 내에서 오류가 발생하는

    http://www.databasejournal.com/features/mysql/mysql-error-handling-using-the-signal-and-resignal-statements.html

    추가

    나는 내이 게시물을 다시 읽고 있어요, 나는 내가 추가 할 추가 뭔가를 깨달았다. MySQL의 버전 5.5 이전에, 예외를 던지는 에뮬레이트 할 수있는 방법이 있었다. 그것은 정확히 같은 일이 아니지만,이 아날로그했다 : 존재하지 않는 프로 시저를 호출을 통해 오류를 생성합니다. 문제가 무엇인지를 결정하는 기준에 유용한 수단을 얻기 위해 의미있는 이름으로 프로 시저를 호출. 오류가 발생하면 (당신의 실행 문맥에 따라) 실패의 라인을 볼 수 있습니다.

    예를 들면 :

    삽입 뭔가 잘못된 시도 CALL;

    당신이 순서를 만들 때 참고, 그런 것들을 수행 유효성 검사가 없음. 컴파일 된 언어 같은, 당신은 이런 스크립트에서, 없었다 함수를 호출하지 않을 수 있지만 그래서 단순히이 경우에 원하는 정확히 어떤 런타임에 실패합니다!

  4. ==============================

    4.왜이 :

    왜이 :

    CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
    BEGIN
         IF tablename IS NOT NULL THEN
              #proceed the code
         END IF;
         # Do nothing otherwise
    END;
    
  5. ==============================

    5.이것은 나를 위해 작동합니다 :

    이것은 나를 위해 작동합니다 :

     CREATE DEFINER=`root`@`%` PROCEDURE `save_package_as_template`( IN package_id int , 
    IN bus_fun_temp_id int  , OUT o_message VARCHAR (50) ,
                OUT o_number INT )
     BEGIN
    
    DECLARE  v_pkg_name  varchar(50) ;
    
    DECLARE  v_pkg_temp_id  int(10)  ; 
    
    DECLARE  v_workflow_count INT(10);
    
    -- checking if workflow created for package
    select count(*)  INTO v_workflow_count from workflow w where w.package_id = 
    package_id ;
    
    this_proc:BEGIN   -- this_proc block start here 
    
     IF  v_workflow_count = 0 THEN
       select 'no work flow ' as 'workflow_status' ;
        SET o_message ='Work flow is not created for this package.';
        SET  o_number = -2 ;
          LEAVE this_proc;
     END IF;
    
    select 'work flow  created ' as 'workflow_status' ;
    -- To  send some message
    SET o_message ='SUCCESSFUL';
    SET  o_number = 1 ;
    
      END ;-- this_proc block end here 
    
    END
    
  6. ==============================

    6.

    MainLabel:BEGIN
    
    IF (<condition>) IS NOT NULL THEN
        LEAVE MainLabel;
    END IF; 
    
    ....code
    
    i.e.
    IF (@skipMe) IS NOT NULL THEN /* @skipMe returns Null if never set or set to NULL */
         LEAVE MainLabel;
    END IF;
    
  7. from https://stackoverflow.com/questions/6260157/mysql-how-to-quit-exit-from-stored-procedure by cc-by-sa and MIT license