#php #mysql #sql #laravel #stored-procedures
Вопрос:
Всем добрый вечер, я вызываю хранимую процедуру с помощью laravel, все отлично работает локально на моей машине, но как только я развертываюсь на сервере (богиня), он отправляет мне пустой массив.
******************************* Хранимая процедура *******************************************
DROP PROCEDURE IF EXISTS procedure_nouveautes; DELIMITER | CREATE PROCEDURE procedure_nouveautes(IN PAYS_ID INT, DEVISE_TO INT) BEGIN DECLARE CATALOGUEID TEXT DEFAULT ""; DECLARE PRODUITID TEXT DEFAULT ""; DECLARE CATALOGUEPRODUITID TEXT DEFAULT ""; DECLARE PVMIN TEXT DEFAULT ""; DECLARE PVMAX TEXT DEFAULT ""; DECLARE PAYSID INT DEFAULT NULL; DECLARE DEVISEVENTEID TEXT DEFAULT ""; DECLARE PRODUITTYPES TEXT DEFAULT ""; DECLARE PVMINCONVERTI DOUBLE DEFAULT 0; DECLARE PVMAXCONVERTI DOUBLE DEFAULT 0; DECLARE PVMINDECLINAISON DOUBLE DEFAULT 0; DECLARE PVMAXDECLINAISON DOUBLE DEFAULT 0; DECLARE TOTAL text DEFAULT ""; DECLARE FIN_LOOP_CURSOR_FOR_NOUVEAUTE BOOLEAN DEFAULT 0; DECLARE FIN_LOOP_CURSOR_MARGE_PRODUIT BOOLEAN DEFAULT 0; DECLARE RESULT_PRIX_MARGE_PRODUIT DOUBLE DEFAULT NULL; DECLARE RESULT_PERCENT_MARGE_PRODUIT DOUBLE DEFAULT NULL; DECLARE PRIX_MARGE_PRODUIT DOUBLE DEFAULT 0; DECLARE PERCENT_MARGE_PRODUIT DOUBLE DEFAULT 0; DECLARE RESULT_DEVISE_ID_MARGE_PRODUIT TEXT DEFAULT ""; DECLARE FIN_LOOP_CURSOR_MARGE_CATALOGUE BOOLEAN DEFAULT 0; DECLARE RESULT_PRIX_MARGE_CATALOGUE DOUBLE DEFAULT NULL; DECLARE RESULT_PERCENT_MARGE_CATALOGUE DOUBLE DEFAULT NULL; DECLARE PRIX_MARGE_CATALOGUE DOUBLE DEFAULT 0; DECLARE PERCENT_MARGE_CATALOGUE DOUBLE DEFAULT 0; DECLARE RESULT_DEVISE_ID_MARGE_CATALOGUE TEXT DEFAULT ""; DECLARE CURSOR_FOR_NOUVEAUTE CURSOR FOR SELECT catalogues.id, catalogues.pays_id,produits.id,produits.types, catalogue_produit.id, catalogue_produit.devise_vente_id, MIN(catalogue_produit.prix_vente) AS min, MAX(catalogue_produit.prix_vente) AS max FROM catalogue_produit INNER JOIN produits ON produits.id = catalogue_produit.produit_id INNER JOIN catalogues ON catalogues.id = catalogue_produit.catalogue_id WHERE catalogue_produit.est_nouveau = 1 GROUP BY catalogue_produit.produit_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIN_LOOP_CURSOR_FOR_NOUVEAUTE = TRUE; DROP TABLE IF EXISTS procedure_nouveautes_table_tmp; CREATE TABLE procedure_nouveautes_table_tmp( id INT NOT NULL AUTO_INCREMENT, catalogue_id VARCHAR(255), pays_id INT, produit_id VARCHAR(255), catalogue_produit_id VARCHAR(255), prix_vente_min VARCHAR(255), prix_vente_max VARCHAR(255), primary key (id) ); OPEN CURSOR_FOR_NOUVEAUTE; REPEAT FETCH CURSOR_FOR_NOUVEAUTE INTO CATALOGUEID, PAYSID, PRODUITID, PRODUITTYPES, CATALOGUEPRODUITID, DEVISEVENTEID,PVMIN, PVMAX; IF NOT FIN_LOOP_CURSOR_FOR_NOUVEAUTE THEN IF PRODUITTYPES = 1 THEN BLOCK_1:BEGIN SELECT MIN(prix_vente) INTO PVMINDECLINAISON FROM declinaisons WHERE produit_id = PRODUITID; SELECT MIN(prix_vente) INTO PVMAXDECLINAISON FROM declinaisons WHERE produit_id = PRODUITID; END BLOCK_1; END IF; BLOCK_2:BEGIN DECLARE CURSOR_MARGE_PRODUIT CURSOR FOR SELECT prix, percent, devise_id FROM marge_produits WHERE pays_id = PAYS_ID AND produit_id = PRODUITID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIN_LOOP_CURSOR_MARGE_PRODUIT = TRUE; OPEN CURSOR_MARGE_PRODUIT; REPEAT FETCH CURSOR_MARGE_PRODUIT INTO RESULT_PRIX_MARGE_PRODUIT, RESULT_PERCENT_MARGE_PRODUIT, RESULT_DEVISE_ID_MARGE_PRODUIT; IF RESULT_PRIX_MARGE_PRODUIT IS NOT NULL THEN -- SET PRIX_MARGE_PRODUIT = RESULT_PRIX_MARGE_PRODUIT; SELECT conversion_devise(RESULT_DEVISE_ID_MARGE_PRODUIT, DEVISE_TO, PAYS_ID, RESULT_PRIX_MARGE_PRODUIT) INTO PRIX_MARGE_PRODUIT; END IF; IF RESULT_PERCENT_MARGE_PRODUIT IS NOT NULL THEN SET PERCENT_MARGE_PRODUIT = RESULT_PERCENT_MARGE_PRODUIT; END IF; UNTIL FIN_LOOP_CURSOR_MARGE_PRODUIT END REPEAT; END BLOCK_2; BLOCK_3:BEGIN DECLARE CURSOR_MARGE_CATALOGUE CURSOR FOR SELECT prix, percent, devise_id FROM marge_catalogues WHERE pays_id = PAYS_ID AND catalogue_id = CATALOGUEID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIN_LOOP_CURSOR_MARGE_CATALOGUE = TRUE; OPEN CURSOR_MARGE_CATALOGUE; REPEAT FETCH CURSOR_MARGE_CATALOGUE INTO RESULT_PRIX_MARGE_CATALOGUE, RESULT_PERCENT_MARGE_CATALOGUE, RESULT_DEVISE_ID_MARGE_CATALOGUE; IF RESULT_PRIX_MARGE_CATALOGUE IS NOT NULL THEN -- SET PRIX_MARGE_CATALOGUE = RESULT_PRIX_MARGE_CATALOGUE; SELECT conversion_devise(RESULT_DEVISE_ID_MARGE_CATALOGUE, DEVISE_TO, PAYS_ID, RESULT_PRIX_MARGE_CATALOGUE) INTO PRIX_MARGE_CATALOGUE; END IF; IF RESULT_PERCENT_MARGE_CATALOGUE IS NOT NULL THEN SET PERCENT_MARGE_CATALOGUE = RESULT_PERCENT_MARGE_CATALOGUE; END IF; UNTIL FIN_LOOP_CURSOR_MARGE_CATALOGUE END REPEAT; END BLOCK_3; SELECT conversion_devise(DEVISEVENTEID, DEVISE_TO, PAYS_ID, (PVMIN PVMINDECLINAISON)) INTO PVMINCONVERTI; SELECT conversion_devise(DEVISEVENTEID, DEVISE_TO, PAYS_ID, (PVMAX PVMAXDECLINAISON)) INTO PVMAXCONVERTI; INSERT INTO procedure_nouveautes_table_tmp (catalogue_id, pays_id, produit_id, catalogue_produit_id, prix_vente_min, prix_vente_max) VALUES(CATALOGUEID, PAYSID, PRODUITID, CATALOGUEPRODUITID, (PVMINCONVERTI PRIX_MARGE_PRODUIT PRIX_MARGE_CATALOGUE (PVMINCONVERTI * (PERCENT_MARGE_CATALOGUE / 100)) (PVMINCONVERTI * (PERCENT_MARGE_PRODUIT / 100))), (PVMAXCONVERTI PRIX_MARGE_PRODUIT PRIX_MARGE_CATALOGUE (PVMAXCONVERTI * (PERCENT_MARGE_CATALOGUE / 100)) (PVMAXCONVERTI * (PERCENT_MARGE_PRODUIT / 100))) ); END IF; UNTIL FIN_LOOP_CURSOR_FOR_NOUVEAUTE END REPEAT; -- CLOSE CURSOR_FOR_NOUVEAUTE; SELECT procedure_nouveautes_table_tmp.*, produits.*, catalogues.*, catalogue_produit.* FROM procedure_nouveautes_table_tmp INNER JOIN produits ON produits.id = procedure_nouveautes_table_tmp.produit_id INNER JOIN catalogues ON catalogues.id = procedure_nouveautes_table_tmp.catalogue_id INNER JOIN catalogue_produit ON catalogue_produit.id = procedure_nouveautes_table_tmp.catalogue_id; END|
**************** Функция ***************************************************************
DROP FUNCTION IF EXISTS conversion_devise; DELIMITER $ CREATE FUNCTION conversion_devise( DEVISE_FROM INT, DEVISE_TO INT, PAYS_ID INT, MONTANT_A_CONVERTIR DOUBLE ) RETURNS DOUBLE DETERMINISTIC BEGIN DECLARE MONTANT_CONVERTI DOUBLE DEFAULT MONTANT_A_CONVERTIR; DECLARE RATE_VALUE DOUBLE DEFAULT 1; SELECT MultiplyRate INTO RATE_VALUE FROM `table_rates` WHERE `ValidTo` gt;= current_timestamp() AND `C_Currency_ID` = DEVISE_FROM AND `C_Currency_ID_To` = DEVISE_TO AND `C_Country_ID` = PAYS_ID LIMIT 1; IF RATE_VALUE IS NOT NULL THEN SET MONTANT_CONVERTI = MONTANT_A_CONVERTIR * RATE_VALUE; END IF; RETURN (MONTANT_CONVERTI); END$ DELIMITER ;
***************** Позвоните с помощью laravel ***************************************************
$nouveautes = DB::select('call procedure_nouveautes(?, ?)', [198, 337]);
Мне нужна ваша помощь, пожалуйста
Комментарии:
1. Попробуйте изменить значение
select
наstatement
, чтобы увидеть, имеет ли это какое-либо значение?