【问题标题】:Error while returning multiple ResulSets from a stored procedure in MySQL从 MySQL 中的存储过程返回多个 ResulSet 时出错
【发布时间】:2020-04-29 11:12:10
【问题描述】:

这是我的存储过程的缩短脚本:

DROP PROCEDURE IF EXISTS `GetVehicleDetails`;
DELIMITER //
CREATE PROCEDURE `GetVehicleDetails`(
    IN `inRefNo` VARCHAR(30) COLLATE utf8mb4_general_ci,
    IN `inSurveyType` VARCHAR(20) COLLATE utf8mb4_general_ci
)
BEGIN
DECLARE vehicleTypeID VARCHAR(2);
SET FOREIGN_KEY_CHECKS = OFF;
SELECT * FROM vehicle_details V
    LEFT JOIN vehicle_types VT ON VT.TypeID = V.VehicleType
    LEFT JOIN vehicle_makes VM ON VM.TypeID = V.VehicleType AND VM.MakeID = V.VehicleMake
    LEFT JOIN vehicle_models VD 
        ON VD.TypeID = V.VehicleType AND VD.MakeID = V.VehicleMake AND VD.ModelID = V.VehicleModel
    LEFT JOIN vehicle_variants VV
        ON VV.TypeID = V.VehicleType
        AND VV.MakeID = V.VehicleMake
        AND VV.ModelID = V.VehicleModel
        AND VV.VariantID = V.VehicleVariant
    LEFT JOIN vehicle_body_types VB ON VB.BodyTypeID = V.TypeOfBody
    LEFT JOIN vehicle_info_preinspection VP ON VP.RefNo = inRefNo
    LEFT JOIN fuel_types F ON F.FuelTypeID = VP.Fuel
WHERE V.RefNo = inRefNo;

# Fetch Vehicle Type 
SELECT VehicleType INTO vehicleTypeID FROM vehicle_details WHERE RefNo = inRefNo;
# Get details of body parts
IF vehicleTypeID = 1 THEN /* Personal Car */
    SELECT * FROM body_parts_personal_car WHERE RefNo = inRefNo;
    /*IF inSurveyType = 'preinspection' THEN
        SELECT * FROM accessories_personal_car WHERE RefNo = inRefNo;
    END IF;*/
ELSEIF vehicleTypeID = 4 THEN /* 2 Wheeler */
    SELECT * FROM body_parts_2_wheeler WHERE RefNo = inRefNo;
ELSE
    SELECT * FROM body_parts_commercial_vehicle WHERE RefNo = inRefNo;
END IF;
SET FOREIGN_KEY_CHECKS = ON;
END//
DELIMITER ;

现在,在使用以下语句执行存储过程时:

CALL GetVehicleDetails('some ref no', 'interim-survey');

一个错误被抛出:

静态分析:
分析过程中发现 1 个错误。
缺少表达。 (靠近位置 25 的“ON”)
SQL 查询:编辑编辑
SET FOREIGN_KEY_CHECKS = ON;
MySQL 说:文档
2014 - 命令不同步;你现在不能运行这个命令

我注意到存储过程在第二个 SELECT 语句上抛出 -

SELECT * FROM body_parts_personal_car WHERE RefNo = inRefNo;

就我而言。即使我在它之前写了SELECT Now();SELECT vehicleTypeID;,存储过程也会抛出同样的错误。如果我将此 SELECT 语句注释掉,则存储过程可以工作。

相同的存储过程可以完美地在 localhost 上运行。我在远程服务器上使用 phpMyAdmin 来维护我的数据库。

有什么帮助吗?

编辑:我在所有有多个SELECT 语句要作为结果集返回的存储过程中都收到相同的问题。

而且,如果我从 phpMyAdmin 的存储过程列表中单击 执行,存储过程就会执行。但是如果我用CALL <proc_name()>;调用存储过程,就会出现上述错误。

【问题讨论】:

  • 如果我在远程服务器上从 HeidiSQL 运行 CALL GetVehicleDetails('some ref no', 'interim-survey');,它会按预期返回结果。但是,如果我从 PHP 脚本运行相同的脚本,它会抛出错误 Fatal error: Allowed memory size of 134217728 bytes exhausted.....
  • 该过程总共返回多少行?有点难以评论 PHP 脚本,因为它不包含在问题中,但听起来该过程返回的行数超过了 PHP 脚本可以处理的行数,或者脚本中存在导致无限循环并且 PHP 用完的错误记忆因此。请不要移动 cmets。
  • 每个 SELECT 查询中的一行。
  • @slaakso 问题可能出在 proc 上,因为 PHP 脚本是一个简单的数据库访问调用,以对象的形式返回结果。
  • 程序没问题。您只需要在脚本中处理多个结果集。

标签: mysql stored-procedures


【解决方案1】:

“Commands out of sync”错误通常表示客户端错误(上一个结果集的结果尚未处理并保留在缓冲区中)。

如果您从 phpMyAdmin 运行程序,请注意 phpMyAdmin 不知道如何处理返回多个结果集的程序。尝试从 MySQL 命令提示符运行命令,看看是否有任何错误。

程序本身看起来没问题,除了不必要的SET FOREIGN_KEY_CHECKS-commands(程序不做任何更新/插入)。

【讨论】:

  • 每个 SELECT 查询中的一行。
  • PHP 脚本是你自己的?也许你应该检查脚本。
【解决方案2】:

过程中涉及的一个或多个表存在问题。过程中的一些查询和过程调用给出了“非法混合排序规则 xxxxxxxx”的错误。我必须设置表的所有 char/varchar/enum 字段和过程参数的 COLLATIONS,从而为 utf8mb4_general_ci 提供错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多