매우 간단한 질문이 있지만 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'
는 “처리되지 않은 사용자 정의 예외 조건”과 같습니다. 기본적으로이 오류 코드는 1644
동일한 의미를 갖습니다. 원하는 경우 다른 조건 코드 또는 오류 코드를 던질 수 있습니다 (예외 처리에 대한 추가 세부 사항 포함).
이 주제에 대한 자세한 내용은 다음을 확인하십시오.
https://dev.mysql.com/doc/refman/5.5/en/signal.html
추가
이 게시물을 다시 읽으면서 추가 할 것이 있다는 것을 깨달았습니다. MySQL v5.5 이전에는 예외 발생을 모방하는 방법이있었습니다. 정확히 같은 것은 아니지만 이것은 아날로그입니다. 존재하지 않는 프로 시저를 호출하여 오류를 작성하십시오. 문제가 무엇인지 확인하는 데 유용한 수단을 얻기 위해 의미있는 이름으로 프로 시저를 호출하십시오. 오류가 발생하면 (실행 컨텍스트에 따라) 실패 라인을 보게됩니다.
예를 들면 다음과 같습니다.
CALL AttemptedToInsertSomethingInvalid;
프로 시저를 작성할 때 해당 항목에 대해 유효성 검증이 수행되지 않습니다. 따라서 컴파일 된 언어와 같은 경우에는 존재하지 않는 함수를 호출 할 수 없으며 이와 같은 스크립트에서는 런타임에 단순히 실패합니다.이 경우 정확히 원하는 것입니다!
답변
이 상황을 이식 가능한 방식으로 처리하려면 (즉, MySQL 레이블 Kung fu를 사용하지 않기 때문에 모든 데이터베이스에서 작동) 다음과 같이 절차를 논리 부분으로 나눕니다.
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 PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NOT NULL THEN
#proceed the code
END IF;
# Do nothing otherwise
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
답변
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;