programing

Mysql - 저장 프로시저를 종료/종료하는 방법

goodjava 2022. 11. 5. 17:47

Mysql - 저장 프로시저를 종료/종료하는 방법

매우 간단한 질문이 있습니다만, 저는 Mysql을 사용하여 SP를 종료할 수 있는 간단한 코드를 받지 못했습니다.어떻게 하는지 공유해주실 분 있나요?

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;
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;

오류가 없는 상황에서 "조기 종료"를 원하는 경우 @piotrm이 게시한 승인된 답변을 사용하십시오.그러나 대부분의 경우 오류 상태(특히 SQL 프로시저)로 인해 문제가 발생합니다.

MySQL v5.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'는 " condition에 합니다. 「이러다」, 「이러다」가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 v5.5 이전 버전에는 예외 발생을 에뮬레이트하는 방법이 있었습니다.정확히 같은 것은 아니지만, 이것은 아날로그입니다.존재하지 않는 프로시저를 호출하여 오류를 생성합니다.문제의 원인을 특정하기 위한 유용한 수단을 얻기 위해 의미 있는 이름을 사용하여 절차를 호출합니다.오류가 발생하면 실행 컨텍스트에 따라 오류 줄이 표시됩니다.

예를 들어 다음과 같습니다.

CALL AttemptedToInsertSomethingInvalid;

프로시저를 작성할 때, 이러한 프로시저에 대해서 검증은 행해지지 않는 것에 주의해 주세요.컴파일된 언어에서는 존재하지 않는 함수를 호출할 수 없습니다.이러한 스크립트에서는 실행 시 단순히 실패합니다.이것이 바로 이 경우에 필요한 것입니다.

이 상황을 휴대용 방식으로 처리하려면(즉, MySQL 라벨 Kungfu를 사용하지 않기 때문에 모든 데이터베이스에서 작동함) 절차를 다음과 같이 논리 부분으로 나눕니다.

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;

이것으로 충분합니다.

 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

왜 안 되는가?

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NOT NULL THEN
          #proceed the code
     END IF;
     # Do nothing otherwise
END;
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;

나중에 에러 필드의 값을 테스트할 수 있다면 이 솔루션이 편리하다고 생각합니다.이는 임시 테이블을 만들고 오류 목록을 반환하는 경우에도 적용할 수 있습니다.

DROP PROCEDURE IF EXISTS $procName;
DELIMITER //
CREATE PROCEDURE $procName($params)
BEGIN
    DECLARE error INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET error = 1;
    SELECT
       $fields
    FROM $tables
    WHERE $where
    ORDER BY $sorting LIMIT 1
    INTO $vars;
    IF error = 0 THEN
       SELECT $vars;
    ELSE
       SELECT 1 AS error;
       SET @error = 0;
    END IF;
END//
CALL $procName($effp);

언급URL : https://stackoverflow.com/questions/6260157/mysql-how-to-quit-exit-from-stored-procedure