2017-12-15 20 views
0

Ich möchte eine öffentliche Err Log-Prozedur erstellen. Mysql 5.7.2 Ich habe versucht, verwenden Bedingung in der gleichen Prozedur, funktioniert. Ich erinnere mich an diese Art und Weise arbeitete vorher, vielleicht alte mysql-Version, oder ich änderte die Einstellung. gerade jetzt, @errNo, @errMsg immer NULL.Verwenden Sie mysql erhalten Diagnose bei einer anderen Prozedur

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_err_log`() 
BEGIN 
    GET DIAGNOSTICS @cno = NUMBER; 
    GET DIAGNOSTICS CONDITION 1 @errNo = MYSQL_ERRNO, @errMsg = MESSAGE_TEXT; 
SELECT @errNo, @errMsg; 
END 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`() 
BEGIN 

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
     CALL sp_err_log();   
    END; 

    select 1; 
    select * from tbl_not_exist; 
    select 2; 
END 

Antwort

0

< MySQL 5.7.2

13.6.7.7 The MySQL Diagnostics Area :: 13.6.7.7.3 How the Diagnostics Area is Populated

...

SQL-Anweisungen klar und stellen Sie den Bereich Diagnostik wie folgt:

  • Wenn der Server nach dem Parsen eine Anweisung ausführt, löscht er den Diagnosebereich für nichtdiagnostische Anweisungen, die Tabellen verwenden. ...

...

Siehe db-fiddle.

> = MySQL 5.7.2

13.6.7.7 The MySQL Diagnostics Area :: 13.6.7.7.3 How the Diagnostics Area is Populated

...

SQL-Anweisungen klar und stellen Sie den Bereich Diagnostik wie folgt:

  • Wenn der Server beginnt nach dem Parsen eine Anweisung auszuführen, löscht den Diagnosebereich für nichtdiagnostische Aussagen. (Vor MySQL 5.7.2, löscht der Server den Diagnosebereich für nondiagnostic Anweisungen, die Tabellen.) ...

...

db-fiddle See.

Mögliche alternative Lösung (> = MySQL 5.7.2):

DELIMITER // 

CREATE PROCEDURE `sp_err_log`(
    `_MYSQL_ERRNO` INT, 
    `_MESSAGE_TEXT` TEXT 
) 
BEGIN 
    SELECT 
    `_MYSQL_ERRNO`, 
    `_MESSAGE_TEXT`; 
END// 

CREATE PROCEDURE `sp_test`() 
BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
    DECLARE 
     `_NUMBER`, 
     `_MYSQL_ERRNO` INT; 
    DECLARE 
     `_MESSAGE_TEXT` TEXT; 
    GET STACKED DIAGNOSTICS `_NUMBER` = NUMBER; 
    GET STACKED DIAGNOSTICS CONDITION `_NUMBER` 
     `_MYSQL_ERRNO` = MYSQL_ERRNO, 
     `_MESSAGE_TEXT` = MESSAGE_TEXT; 
    CALL `sp_err_log`(
     `_MYSQL_ERRNO`, 
     `_MESSAGE_TEXT` 
    ); 
    END; 
    SELECT 1; 
    SELECT NULL 
    FROM `tbl_not_exist`; 
    SELECT 2; 
END// 

DELIMITER ; 

Siehe db-fiddle.

+0

Vielen Dank für das Detail über verschiedene Version. Also verstehe ich, dass es unmöglich ist, dies für> = 5.7.2 – wa56

+0

@ wa56 zu tun: Tatsächlich folgt MySQL nun dem SQL-Standard, siehe [Änderungen in MySQL 5.7.2 (2013-09-21, Meilenstein 12) :: Diagnose-Hinweise ] (https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-2.html#mysqld-5-7-2-diagnostics). – wchiquito

Verwandte Themen