非常に簡単な質問がありますが、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;
この状況を移植可能な方法で処理するには(つまり、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;
エラーが発生していない状況で「早期終了」が必要な場合は、@ 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;
プロシージャを作成する場合、そのようなことに対して検証は実行されないことに注意してください。したがって、コンパイルされた言語のようなものでは、そこになかった関数を呼び出すことはできませんが、このようなスクリプトでは、実行時に単に失敗します。これはまさにこの場合に望ましいことです!
これは私のために働く:
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;