Ошибка при возврате нескольких ResulSets из хранимой процедуры в MySQL - PullRequest
1 голос
/ 12 января 2020

Вот сокращенный скрипт моей хранимой процедуры:

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');

выдается ошибка:

Stati c анализ:
1 ошибок было обнаружено во время анализа.
Отсутствует выражение. (около «ON» в позиции 25)
SQL запрос: Edit Edit
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, которые должны быть возвращены обратно как ResultSet.

И, если я нажму Выполнить из списка хранимых процедур в phpMyAdmin, хранимая процедура будет выполнена. Но если я вызову хранимую процедуру с CALL <proc_name()>;, отобразится вышеуказанная ошибка.

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Ошибка «Команды не синхронизированы c» обычно указывает на ошибку на стороне клиента (результаты предыдущего набора результатов не были обработаны и остаются в буфере).

Если вы выполняете процедуру из phpMyAdmin обратите внимание, что phpMyAdmin не знает, как обрабатывать процедуры, возвращающие несколько наборов результатов. Попробуйте выполнить команду из командной строки MySQL и посмотрите, нет ли ошибок.

Сама процедура выглядит нормально, за исключением ненужных SET FOREIGN_KEY_CHECKS -команд (процедура не выполняет обновление / вставку) .

0 голосов
/ 09 февраля 2020

Была проблема с одной или несколькими таблицами, участвующими в процедуре. Некоторые запросы и вызовы процедур внутри процедуры выдавали ошибки как «недопустимое сочетание параметров сортировки xxxxxxxx». Мне пришлось установить COLLATIONS всех char / varchar / enum полей таблиц и параметров процедур, выдающих ошибки utf8mb4_general_ci .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...