2011-09-12 10 views
9

逐次実行するSQLスクリプトでは、クエリ実行の流れを制御するためのIF THEN ELSE条件を導入する方法はありますか?MysqlのSQLスクリプトで条件付きの場合

私にはこのhttp://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm に実行されたことがあります。この場合、IF THEN ELSEはSQLスクリプトでは機能しません。

別の方法がありますか?

基本的には、特定の「select colName from table」コマンドを実行して、colNameが特定の値に対応しているかどうかを確認します。存在する場合は、残りのスクリプトを実行します。そうでなければ、実行を停止します。

お知らせください。

+0

提供されたリンクから:「関数とストアドプロシージャでのみ許可されています。 – user470714

+0

スクリプトをストアドプロシージャに配置してから、プロシージャを呼び出すことができます。 – Owen

+0

組合はどうですか? – ajreal

答えて

16

私は、条件付きコードが許可されているプロシージャでSQLスクリプトをラップするだけです。ステートメントを置いたままにするのではなく、終了したらプロシージャを削除することができます。ここに例があります:

delimiter // 

create procedure insert_games() 

begin 

    set @platform_id := (select id from platform where name = 'Nintendo DS'); 

    -- Only insert rows if the platform was found 
    if @platform_id is not null then 

     insert into game(name, platform_id) values('New Super Mario Bros', @platform_id); 
     insert into game(name, platform_id) values('Mario Kart DS', @platform_id); 

    end if; 

end; 

// 

delimiter ; 

-- Execute the procedure 
call insert_games(); 

-- Drop the procedure 
drop procedure insert_games; 

手順を使用していない場合は、「区切り文字」キーワードに何らかの説明が必要な場合があります。最初の行はデリミタを "//"に切り替え、MySQLがまだそれらを解釈しようとせずにプロシージャ定義にセミコロンを含めることができます。手続きが作成されると、区切り文字を ";"に戻します。私たちはいつものようにステートメントを実行できます。

0

いくつかの調査をした後、私はこれを回避する方法を見つけた可能性があります。私は、スクリプトがすでにターゲットデータベースに対して実行されているかどうかを検証する方法を探していました。これは主に私のデータベースのバージョン管理のためのものです。私は実行されたスクリプトを追跡するために作成されたテーブルを持っていて、実行前にそのテーブルを最初にチェックするためにスクリプト内のいくつかのフローを必要としていました。私はまだ問題を完全に解決していませんが、基本的に必要なものを実行する単純なスクリプトを作成しました。変数の値に基づいて選択肢にDDLをラップするだけです。

ステップ1 - セットアップ結果を保持するビット変数 ステップ2 - あなたの選択を行うと、変数を設定し、結果が見つかった場合 ステップ3 - あなたは偽の結果に何をする必要があるかですか ステップ4 - 何をすべきかあなたはここに

= 0 @schemachangeidサンプルスクリプト

セットで真の結果に行う必要があります。

@schemachangeid:= 1 from SchemaChangeLogここで、scriptname = '1_create_tables.sql';

デュアルから 'scriptalreadyran'を選択します。@schemachangeid = 1;

デュアルから 'scriptnotran'を選択します。@schemachangeid = 0;

これは古いスレッドだと認識していますが、これは私のようなストアドプロシージャの外でこのようなことをしようとしている人に役立つかもしれません。