[SQL] MySQL은 - 어떻게 저장 프로 시저에서 / 종료를 종료합니다
SQLMySQL은 - 어떻게 저장 프로 시저에서 / 종료를 종료합니다
나는 아주 간단한 질문이 있습니다하지만 난 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.
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.이 같은 논리 부분으로 절차를 헤어, (그것은 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.당신이 오류가 없었다있는 상황에 대해 "조기 종료"를 원한다면, @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.왜이 :
왜이 :
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.이것은 나를 위해 작동합니다 :
이것은 나를 위해 작동합니다 :
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.
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;
from https://stackoverflow.com/questions/6260157/mysql-how-to-quit-exit-from-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 자신에게 로컬 SQL Server 인스턴스에 대한 관리자 액세스 권한을 부여합니까? (0) | 2020.06.20 |
---|---|
[SQL] 때 대신 테이블의보기를 사용하려면? (0) | 2020.06.20 |
[SQL] 표에서 SQL의 변경 스키마 이름 (0) | 2020.06.20 |
[SQL] MySQL은 낙관적 잠금 (0) | 2020.06.20 |
[SQL] 왜 외부 키는 더 많은 연습보다 이론적으로 사용됩니까? (0) | 2020.06.20 |