【发布时间】: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 脚本是一个简单的数据库访问调用,以对象的形式返回结果。
-
程序没问题。您只需要在脚本中处理多个结果集。