Drukuj informacje debugowania z procedury składowanej w MySQL

84

Czy w MySQL istnieje sposób na drukowanie komunikatów debugowania na standardowe wyjście, kuszące lub plik dziennika? Coś jak:

  • print w SQLServer
  • DBMS_OUTPUT.PUT_LINE w Oracle
Arachid
źródło
loguj się z dowolnego miejsca za pomocą incron stackoverflow.com/a/41766032/953374
bortunac

Odpowiedzi:

117

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 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 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.

Patrick
źródło
3
mysql narzeka Not allowed to return a result set from a trigger, jakiś pomysł?
Jerry Chin
Prawdopodobnie rozwiązałeś problem w prawie 3 lata, ale użyj danych wyjściowych do pliku, aby pozbyć się błędu.
Gabriel Cliseru
6

Szybki sposób na wydrukowanie czegoś to:

select '** Place your mesage here' AS '** DEBUG:';
Roberto Rodriguez
źródło
5

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.

Rob Cooke
źródło
5
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ć:

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.

Mohan Munisifreddy
źródło