以下存储过程按预期工作,但如果我强制发生错误(请参阅 INSERT 语句中的故意 type-o),我不会收到任何错误信息。
我创建了一个名为 error_check 的表,并尝试在其中插入错误信息以查看是否可以获得更多信息,但是当出现错误时,不会向表中添加任何行。 (当我取出 type-o 时,正如预期的那样,我得到了一个包含空值的新行。)
这曾经有效,所以我确信这是我错误添加的。
CREATE DEFINER=`root`@`localhost` PROCEDURE `addClassToMasterList`( IN begin_date VARCHAR(10), IN day_num INT,
IN startTime VARCHAR(10), IN endTime VARCHAR (20), IN loc_id INT, IN studio VARCHAR(20),
IN class_name VARCHAR(45), IN owner_id INT,
IN club_id INT, OUT return_id VARCHAR(250))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION, NOT FOUND, SQLWARNING
BEGIN
ROLLBACK;
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE,
@errno = MYSQL_ERRNO,
@text = MESSAGE_TEXT;
SET @display_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
END; /*end of exception handing*/
SET @formatted_date = STR_TO_DATE(begin_date, '%m/%d/%Y');
/* Save all data as a new row in the Master Schedule */
INSERT INTO master_class_list_typeo_here
VALUES (null,
day_num,
@formatted_date,
null,
startTime,
endTime,
loc_id,
studio,
class_name,
owner_id,
club_id);
SELECT LAST_INSERT_ID() INTO @new_id;
/* Put bits of error into a table so I can see what is going on. */
INSERT INTO error_check
VALUES (null, @display_error, @text, @errno);
/* If an error message was generated, return the error.
Otherwise, return the new id that was automatically created. */
SELECT IF (@display_error, @display_error, @new_id) INTO return_id;
/* Also tried: SELECT @display_error INTO return_id; */
END
最佳答案
尝试:
...
GET STACKED DIAGNOSTICS CONDITION 1
...
13.6.7.3 GET DIAGNOSTICS Syntax
...
The keyword STACKED means to retrieve information from the second diagnostics area, which is available only if the current context is a condition handler.
...
参见db-fiddle .
关于mySQL 存储过程没有给我错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46791969/