如何查看MySQL存储过程中的错误?

如何查看MySQL存储过程中的错误?,mysql,perl,stored-procedures,dbi,Mysql,Perl,Stored Procedures,Dbi,关于在事务中使用MySQL存储过程,我在获取错误输出时遇到了一个问题 问题是,我需要设置一个exit_处理程序,以便在任何操作失败时回滚事务。但当我这样做时,如果出现问题,我不会得到任何错误输出。例如,如果我不小心传递了一个空值,并试图将其插入到一个非空字段中 我使用返回值以编程方式指示成功或失败,但这并不能告诉我实际出了什么问题 我正在使用PerlDBI与MySQL对话。我在生产服务器上使用MySQL 5.0.92,在开发服务器上使用MySQL 5.0.51a。升级到MySQL的更新版本在政治

关于在事务中使用MySQL存储过程,我在获取错误输出时遇到了一个问题

问题是,我需要设置一个exit_处理程序,以便在任何操作失败时回滚事务。但当我这样做时,如果出现问题,我不会得到任何错误输出。例如,如果我不小心传递了一个空值,并试图将其插入到一个非空字段中

我使用返回值以编程方式指示成功或失败,但这并不能告诉我实际出了什么问题

我正在使用PerlDBI与MySQL对话。我在生产服务器上使用MySQL 5.0.92,在开发服务器上使用MySQL 5.0.51a。升级到MySQL的更新版本在政治上是站不住脚的

这是一个简化的示例:

DELIMITER //
CREATE PROCEDURE pmt_new(

  app_id            varchar(40),

  out ret           tinyint unsigned,
  out pmt_req_id    int(10) unsigned)
BEGIN

DECLARE v_pmt_req_type int(10) unsigned;

DECLARE exit handler for not found, sqlwarning, sqlexception rollback;

set ret=1;
START TRANSACTION;

  SELECT pmt_type INTO v_pmt_req_type FROM pmt_req_types WHERE pmt_req_name = 'Name 1';

  INSERT INTO pmt_reqs (pmt_req_id,    pmt_req_type,   app_id)
  values               (null,          v_pmt_req_type, app_id);

  set pmt_req_id = last_insert_id();

  INSERT INTO other (pmt_req_id) values (pmt_req_id);

COMMIT;
set ret=0;
END//  
DELIMITER ;

除了在退出处理程序中执行回滚之外,您还需要返回一些内容

你现在有

DECLARE exit handler for not found, sqlwarning, sqlexception rollback;
把它改成

DECLARE exit handler for not found, sqlwarning, sqlexception
  begin
    rollback;
    select "We had to rollback, error!";
  end;
在5.5版本中,他们添加了SIGNAL/RESIGNAL语句,这样您就可以“返回”错误,但之前的版本中您必须使用自己的解决方案。如果需要,您可以声明多个退出处理程序以更好地定制输出,或者设置您自己的错误表

您还可以在存储过程中进行输入测试。想知道app_id是否为空吗

DELIMITER //
CREATE PROCEDURE pmt_new(

  app_id            varchar(40),
  out result        varchar(256),
  out ret           tinyint unsigned,
  out pmt_req_id    int(10) unsigned)
BEGIN

  DECLARE v_pmt_req_type int(10) unsigned;

  DECLARE exit handler for not found, sqlwarning, sqlexception rollback;

  SET ret=1;
  SET result = "";

  IF app_id IS NULL THEN
    set result = "Supplied ID is Null";
  ELSE

    START TRANSACTION;

      SELECT pmt_type INTO v_pmt_req_type FROM pmt_req_types WHERE pmt_req_name = 'Name 1';

      INSERT INTO pmt_reqs (pmt_req_id,    pmt_req_type,   app_id)
      values               (null,          v_pmt_req_type, app_id);

      set pmt_req_id = last_insert_id();

      INSERT INTO other (pmt_req_id) values (pmt_req_id);

    COMMIT;
    set ret=0;
  END IF;
END//  
DELIMITER ;

这样做会添加另一个out参数,但会提供更好的信息。您可以对多个退出处理程序执行相同的操作

@NXT您只是将“ret”用作真/假,而不是使用它为自己提供所需的信息。(如中所示,更详细的故障信息)。我的回答向你展示了一种做你想做的事的方法。我将用更多信息编辑我的答案,您可能想尝试一下。