ストアドプロシージャをデバッグするための私の現在のプロセスは非常に簡単です。実行時にストアドプロシージャから変数値を挿入する「デバッグ」というテーブルを作成します。これにより、スクリプトの特定のポイントで変数の値を確認できますが、MySQLストアドプロシージャをデバッグするより良い方法はありますか?
私はあなたに非常に似たようなことをします。
通常、デフォルトでfalseに設定されたDEBUGパラメーターを含め、実行時にtrueに設定できます。次に、デバッグステートメントを「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 BEGIN
select concat("** ", msg) AS '** DEBUG:';
END; 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
はい、この種の専用ツールがあります- MySQL Debugger 。
ストアドプロシージャをデバッグするためのGUIツール /MySQLの関数とスクリプトがあります。 dbForge Studio for MySQLが提供する適切なツールは、豊富な機能と安定性を備えています。
MySQLストアドプロシージャのデバッグ方法
貧乏人デバッガー:
id INT
とlog VARCHAR(255)
の2つの列を持つlogtableというテーブルを作成します。
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));
何が起こっているのかを理解するのは、素晴らしく素早い汚い小さなロガーです。
Debugger for 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を配置して、それが実行されるかどうかを確認することもできます。
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
ここで言及されました
ストアドプロシージャの重要な領域にselectステートメントを配置して、データセットの現在のステータスを確認し、それらをコメントアウト(--select ...)するか、実稼働前に削除するだけです。
私はパーティーに遅れましたが、もっとビールを持ってきました:
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 Server Explorerで接続を選択します。
- [ストアドプロシージャ]フォルダを展開します。直接デバッグできるのはストアドプロシージャのみです。ユーザー定義関数をデバッグするには、ストアドを作成します
関数を呼び出す手順。- ストアドプロシージャノードをクリックし、右クリックしてコンテキストメニューから[デバッグルーチン]を選択します。
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製品のストアドプロシージャデバッガエンジンを作成した開発者でした。
MySQLの最初の安定したデバッガーは、dbForge Studio for MySQLにあります。
2つの異なるツールを使用して、手順と機能をデバッグしました。
@ -Brad Parksによる this に対応する回答
関数(プロシージャではなく)であり、テキスト(文字制限なし)を返す関数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
ヒキガエルmysql。フリーウェアバージョンがあります http://www.quest.com/toad-for-mysql/