Gibt es in MySQL eine Möglichkeit, Debugging-Nachrichten in Standard, Versuchung oder Protokolldatei zu drucken? Etwas wie:
print
in SQLServerDBMS_OUTPUT.PUT_LINE
in Oracle
Antworten:
Option 1: Fügen Sie dies in Ihre Prozedur ein, um 'Kommentar' zu stdout zu drucken, wenn es ausgeführt wird.
SELECT 'Comment';
Option 2: Fügen Sie dies in Ihre Prozedur ein, um eine Variable damit zu stdout zu drucken:
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
Dies wird myvar is 5
bei Ausführung der Prozedur auf stdout gedruckt .
Option 3: Erstellen Sie eine Tabelle mit einer aufgerufenen tmptable
Textspalte und senden Sie Nachrichten an diese:
declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
Sie könnten das Obige in eine gespeicherte Prozedur einfügen, sodass Sie nur Folgendes schreiben müssten:
CALL log(concat('the value is', myvar));
Das spart ein paar Tastenanschläge.
Option 4, Nachrichten in Datei protokollieren
select "penguin" as log into outfile '/tmp/result.txt';
Dieser Befehl unterliegt sehr starken Einschränkungen. Sie können die Outfile nur in Bereiche auf der Festplatte schreiben, die der Gruppe "Andere" Erstellungs- und Schreibberechtigungen erteilen. Es sollte funktionieren, wenn es im Verzeichnis / tmp gespeichert wird.
Auch wenn Sie das Outfile einmal geschrieben haben, können Sie es nicht mehr überschreiben. Dies soll verhindern, dass Cracker Ihre Box rooten, nur weil sie SQL in Ihre Website injiziert haben und beliebige Befehle in MySQL ausführen können.
Not allowed to return a result set from a trigger
, eine Idee?
Eine Problemumgehung besteht darin, select ohne weitere Klauseln zu verwenden.
Normalerweise erstelle ich eine Protokolltabelle mit einer gespeicherten Prozedur, um mich dort anzumelden. Rufen Sie die Protokollierungsprozedur auf, wo immer dies aus der in der Entwicklung befindlichen Prozedur erforderlich ist.
Wenn man sich andere Beiträge zu dieser Frage ansieht, scheint dies eine gängige Praxis zu sein, obwohl es einige Alternativen gibt.
Der schnelle Weg, etwas zu drucken, ist:
select '** Place your mesage here' AS '** DEBUG:';
So werde ich debuggen:
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
Wenn Abfrage 1, 2 oder 3 einen Fehler auslösen, fängt HANDLER die SQLEXCEPTION ab und SHOW ERRORS zeigt Fehler für uns an. Hinweis: SHOW ERRORS sollte die erste Anweisung im HANDLER sein.