ストアドプロシージャをデバッグするための現在のプロセスは非常に単純です。"debug"と呼ばれるテーブルを作成し、実行時にストアドプロシージャから変数値を挿入します。これにより、スクリプトの特定のポイントで変数の値を確認できますが、MySQLストアドプロシージャをデバッグするより良い方法はありますか?
ストアドプロシージャをデバッグするための現在のプロセスは非常に単純です。"debug"と呼ばれるテーブルを作成し、実行時にストアドプロシージャから変数値を挿入します。これにより、スクリプトの特定のポイントで変数の値を確認できますが、MySQLストアドプロシージャをデバッグするより良い方法はありますか?
回答:
私はあなたにとても似ています。
通常はデフォルトでfalseに設定され、実行時にtrueに設定できるDEBUGパラメータを含めます。次に、デバッグステートメントを「If DEBUG」ブロックにラップします。
また、プロセスとタイミングを確認できるように、多くのジョブでロギングテーブルを使用しています。私のデバッグコードもそこに出力を取得します。呼び出し元のパラメーター名、簡単な説明、影響を受ける行数(該当する場合)、コメントフィールド、およびタイムスタンプを含めます。
優れたデバッグツールは、すべてのSQLプラットフォームの悲しい失敗の1つです。
次のdebug_msg
プロシージャを呼び出すと、デバッグメッセージをコンソールに出力できます。
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$
CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
IF enabled THEN
select concat('** ', msg) AS '** DEBUG:';
END IF;
END $$
CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
SET @enabled = TRUE;
call debug_msg(@enabled, 'my first debug message');
call debug_msg(@enabled, (select concat_ws('','arg1:', arg1)));
call debug_msg(TRUE, 'This message always shows up');
call debug_msg(FALSE, 'This message will never show up');
END $$
DELIMITER ;
次に、次のようにテストを実行します。
CALL test_procedure(1,2)
結果は次のようになります。
** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
INSERT INTO my_log_table (message) VALUES (msg)
関数呼び出しが終了したら(つまり、手順に戻ったら)すべてのデバッグメッセージを取得できます
はい、この種のものに特化したツールがあります-MySQLデバッガー。
MySQLストアドプロシージャをデバッグする方法。
貧乏人デバッガ:
2列のログ表と呼ばれるテーブルを作成し、id INT
そしてlog VARCHAR(255)
。
id列を自動インクリメントにします。
この手順を使用します。
delimiter //
DROP PROCEDURE `log_msg`//
CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
BEGIN
insert into logtable select 0, msg;
END
このコードを、メッセージをテーブルに記録する場所に配置します。
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
何が起こっているのかを理解するのは、素晴らしくて汚い小さなロガーです。
MySQLには、ストアドプロシージャ /関数およびスクリプトをデバッグするためのGUIツールがあります。MySQLのdbForge Studioが適切なツールであり、豊富な機能と安定性を備えています。
mysqlのデバッガーは優れていましたが、無料ではありませんでした。これは私が今使っているものです:
DELIMITER GO$
DROP PROCEDURE IF EXISTS resetLog
GO$
Create Procedure resetLog()
BEGIN
create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam;
truncate table log;
END;
GO$
DROP PROCEDURE IF EXISTS doLog
GO$
Create Procedure doLog(in logMsg nvarchar(2048))
BEGIN
insert into log (msg) values(logMsg);
END;
GO$
ストアドプロシージャでの使用:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
ストアドプロシージャの使用法:
call resetLog ();
call stored_proc();
select * from log;
別の方法がここに示されています
http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
カスタムデバッグmySqlプロシージャとログテーブルを使用します。
コードに単純な選択を配置して、それが実行されるかどうかを確認することもできます。
SELECT 'Message Text' AS `Title`;
このアイデアは
http://forums.mysql.com/read.php?99,78155,78225#msg-78225
また、誰かがカスタムデバッグ手順のテンプレートをGitHubで作成しました。
こちらをご覧ください
http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines
ここで言及されました
私はパーティーに遅れましたが、ビールをもっと持ってきました:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ および https://github.com/ocelot-inc/ocelotgui
私が試したところ、かなり安定しており、ブレークポイントと変数の検査をサポートしています。
これは完全なスイート(わずか4,1 Mb)ではありませんが、非常に役立ちました。
仕組み:mysqlクライアント(私はUbuntu 14.04を使用しています)と統合し、実行後:
$install
$setup yourFunctionName
デバッグプロセスを制御する新しいデータベースをサーバーにインストールします。そう:
$debug yourFunctionName('yourParameter')
ステップバイステップでコードを実行し、変数を「更新」する機会が与えられます。これにより、コード内で何が行われているのかをよりよく確認できます。
重要なヒント:デバッグ中に変更する可能性があります(手順を再作成)。再作成後、新しい$ debugの前に$ exitおよび$ setupを実行します。
これは、「挿入」および「ログ」メソッドの代替手段です。コードには、追加の「デバッグ」命令がありません。
スクリーンショット:
MySQL Connector / Net 6.6には、ストアドプロシージャと関数をデバッグする機能があります。
デバッガーのインストール
ストアドプロシージャデバッガーを有効にするには:
- Connector / Net 6.6の場合:Connector / Net 6.6をインストールし、[完全]オプションを選択します。
- Connector / Net 6.7以降の場合:ストアドプロシージャデバッガーが属するVisual Studio用の製品MySQLをインストールします。
デバッガーの開始
デバッガーを起動するには、次の手順に従います。
- Visual Studioサーバーエクスプローラーで接続を選択します。
- ストアドプロシージャフォルダーを展開します。直接デバッグできるのは、ストアドプロシージャだけです。ユーザー定義関数をデバッグするに
は、関数を呼び出すストアドプロシージャを作成します。- ストアドプロシージャノードをクリックして右クリックし、コンテキストメニューから[デバッグルーチン]を選択します。
MySql Connector / NETには、バージョン6.6の時点でVisual Studioに統合されたストアドプロシージャデバッガーも含まれています。インストーラーとソースは、http://dev.mysql.com/downloads/connector/net/から入手できます。
いくつかのドキュメント/スクリーンショット:https : //dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
ここのアナウンスに従うことができます:http ://forums.mysql.com/read.php?38,561817,561817#msg-561817
更新:Visual StudioのMySqlはConnector / NETから別の製品に分割されました。https://dev.mysql.com/downloads/windows/visualstudio/1.2.htmlからそれを選択できます (デバッガーを含む)。フリー&オープンソース)。
免責事項:私はMySQL for Visual Studio製品のストアドプロシージャデバッガエンジンを作成した開発者でした。
手順と機能をデバッグするために2つの異なるツールを使用しました。
MySQLユーザー定義変数(セッションで共有)をログ出力として使用できます。
DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
SET @stmt = CONCAT('SELECT * FROM ', tableName);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
-- uncomment after debugging to cleanup
-- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;
出力されます:
SELECT * FROM foo
ヒキガエルmysql。フリーウェアのバージョンがあり ますhttp://www.quest.com/toad-for-mysql/
@Brad Parksによるこれに対応する回答MySQLのバージョンは不明ですが、私のバージョンは5.6でした。
debug_msg
(プロシージャではなく)関数であり、テキスト(文字数制限なし)を返す関数を作成し、その関数をSELECT debug_msg
(params)AS として呼び出し、my_res_set
以下のようにコード化します。
CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
READS SQL DATA
BEGIN
IF enabled=1 THEN
return concat('** DEBUG:', "** ", msg);
END IF;
END
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
IN RegionID VARCHAR(20),
IN RepCurrency INT(11),
IN MGID INT(11),
IN VNC VARCHAR(255)
)
BEGIN
SET @enabled = TRUE;
SET @mainQuery = "SELECT * FROM Users u";
SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER