MySQLにデバッグメッセージをstdout、temptable、またはlogfileに出力する方法はありますか?何かのようなもの:
print
SQLServerでDBMS_OUTPUT.PUT_LINE
Oracleで
回答:
オプション1:これをプロシージャに入れて、実行時に「コメント」をstdoutに出力します。
SELECT 'Comment';
オプション2:これをプロシージャに入れて、変数を標準出力に出力します。
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
これmyvar is 5
は、プロシージャの実行時にstdoutに出力されます。
オプション3、と呼ばれる1つのテキスト列を持つテーブルを作成しtmptable
、それにメッセージをプッシュします。
declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
上記をストアドプロシージャに入れることができるので、書く必要があるのはこれだけです。
CALL log(concat('the value is', myvar));
これにより、いくつかのキーストロークが節約されます。
オプション4、メッセージをファイルに記録する
select "penguin" as log into outfile '/tmp/result.txt';
このコマンドには非常に厳しい制限があります。「others」グループに作成および書き込み権限を付与するディスク上の領域にのみ、出力ファイルを書き込むことができます。/ tmpディレクトリに保存すると機能するはずです。
また、一度出力ファイルを書き込むと、それを上書きすることはできません。これは、クラッカーがWebサイトにSQLを挿入し、MySQLで任意のコマンドを実行できるという理由だけで、クラッカーがボックスをルート化するのを防ぐためです。
Not allowed to return a result set from a trigger
、何か考えはありますか?
1つの回避策は、他の句なしでselectを使用することです。
私は通常、それにログを記録するためのストアドプロシージャを使用してログテーブルを作成します。開発中のプロシージャから必要に応じてロギングプロシージャを呼び出します。
この同じ質問に関する他の投稿を見ると、いくつかの選択肢がありますが、それは一般的な方法のようです。
何かを印刷する簡単な方法は次のとおりです。
select '** Place your mesage here' AS '** DEBUG:';
これが私がデバッグする方法です:
CREATE PROCEDURE procedure_name()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS; --this is the only one which you need
ROLLBACK;
END;
START TRANSACTION;
--query 1
--query 2
--query 3
COMMIT;
END
クエリ1、2、または3がエラーをスローする場合、HANDLERはSQLEXCEPTIONをキャッチし、SHOWERRORSはエラーを表示します。注:SHOW ERRORSは、HANDLERの最初のステートメントである必要があります。