Czy w MySQL istnieje sposób na drukowanie komunikatów debugowania na standardowe wyjście, kuszące lub plik dziennika? Coś jak:
print
w SQLServerDBMS_OUTPUT.PUT_LINE
w Oracle
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.
Not allowed to return a result set from a trigger
, jakiś pomysł?
Jednym obejściem jest użycie funkcji select bez żadnych innych klauzul.
Szybki sposób na wydrukowanie czegoś to:
select '** Place your mesage here' AS '** DEBUG:';
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.
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.