Opcja 1: Umieść to w swojej procedurze, aby wydrukować „komentarz” na stdout po uruchomieniu.
SELECT'Comment';
Opcja 2: Umieść to w swojej procedurze, aby wydrukować zmienną z nią na stdout:
declare myvar INTdefault0;
SET myvar = 5;
SELECTconcat('myvar is ', myvar);
Drukuje myvar is 5na standardowe wyjście, gdy procedura jest uruchomiona.
Opcja 3. Utwórz tabelę z jedną kolumną tekstową o nazwie tmptablei wysyłaj do niej wiadomości:
declare myvar INTdefault0;
SET myvar = 5;
insertinto tmptable selectconcat('myvar is ', myvar);
Możesz umieścić powyższe w procedurze składowanej, więc wszystko, co musiałbyś napisać, to:
CALLlog(concat('the value is', myvar));
Co oszczędza kilka naciśnięć klawiszy.
Opcja 4, rejestruj komunikaty do pliku
select"penguin"aslogintooutfile'/tmp/result.txt';
To polecenie ma bardzo duże ograniczenia. Możesz zapisać plik wyjściowy tylko w obszarach na dysku, które dają grupie „inne” uprawnienia do tworzenia i zapisu. Powinien działać, zapisując go w katalogu / tmp.
Również po napisaniu pliku wyjściowego nie można go zastąpić. Ma to na celu zapobieżenie zrootowaniu twojego komputera przez crackerów tylko dlatego, że wstrzyknął SQL do twojej witryny i może uruchamiać dowolne polecenia w MySQL.
Zwykle tworzę tabelę dziennika z procedurą składowaną, aby się do niej zalogować. Wywołaj procedurę logowania w razie potrzeby z opracowywanej procedury.
Patrząc na inne posty na to samo pytanie, wydaje się, że jest to powszechna praktyka, chociaż istnieje kilka alternatyw.
Tablica dziennika powinna być MyISAM lub innym nietransakcyjnym silnikiem pamięci masowej, aby można było śledzić nawet
wycofane
4
Oto sposób, w jaki będę debugować:
CREATEPROCEDURE procedure_name()
BEGINDECLAREEXITHANDLERFOR SQLEXCEPTION
BEGINSHOWERRORS; --this is the only one which you needROLLBACK;
END;
STARTTRANSACTION;
--query 1--query 2--query 3COMMIT;
END
Jeśli zapytanie 1, 2 lub 3 zwróci błąd, HANDLER przechwyci SQLEXCEPTION, a SHOW ERRORS pokaże nam błędy. Uwaga: SHOW ERRORS powinno być pierwszą instrukcją w HANDLER.
Odpowiedzi:
Opcja 1: Umieść to w swojej procedurze, aby wydrukować „komentarz” na stdout po uruchomieniu.
SELECT 'Comment';
Opcja 2: Umieść to w swojej procedurze, aby wydrukować zmienną z nią na stdout:
declare myvar INT default 0; SET myvar = 5; SELECT concat('myvar is ', myvar);
Drukuje
myvar is 5
na standardowe wyjście, gdy procedura jest uruchomiona.Opcja 3. Utwórz tabelę z jedną kolumną tekstową o nazwie
tmptable
i wysyłaj do niej wiadomości:declare myvar INT default 0; SET myvar = 5; insert into tmptable select concat('myvar is ', myvar);
Możesz umieścić powyższe w procedurze składowanej, więc wszystko, co musiałbyś napisać, to:
CALL log(concat('the value is', myvar));
Co oszczędza kilka naciśnięć klawiszy.
Opcja 4, rejestruj komunikaty do pliku
select "penguin" as log into outfile '/tmp/result.txt';
To polecenie ma bardzo duże ograniczenia. Możesz zapisać plik wyjściowy tylko w obszarach na dysku, które dają grupie „inne” uprawnienia do tworzenia i zapisu. Powinien działać, zapisując go w katalogu / tmp.
Również po napisaniu pliku wyjściowego nie można go zastąpić. Ma to na celu zapobieżenie zrootowaniu twojego komputera przez crackerów tylko dlatego, że wstrzyknął SQL do twojej witryny i może uruchamiać dowolne polecenia w MySQL.
źródło
Not allowed to return a result set from a trigger
, jakiś pomysł?Jednym obejściem jest użycie funkcji select bez żadnych innych klauzul.
http://lists.mysql.com/mysql/197901
źródło
Szybki sposób na wydrukowanie czegoś to:
select '** Place your mesage here' AS '** DEBUG:';
źródło
Zwykle tworzę tabelę dziennika z procedurą składowaną, aby się do niej zalogować. Wywołaj procedurę logowania w razie potrzeby z opracowywanej procedury.
Patrząc na inne posty na to samo pytanie, wydaje się, że jest to powszechna praktyka, chociaż istnieje kilka alternatyw.
źródło
Oto sposób, w jaki będę debugować:
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
Jeśli zapytanie 1, 2 lub 3 zwróci błąd, HANDLER przechwyci SQLEXCEPTION, a SHOW ERRORS pokaże nam błędy. Uwaga: SHOW ERRORS powinno być pierwszą instrukcją w HANDLER.
źródło