У меня есть хранимая процедура на моем производственном сервере, как показано ниже:
delimiter ;;
CREATE PROCEDURE `GetAssessmentData`(
IN inRefNo VARCHAR(30) COLLATE utf8mb4_general_ci
)
BEGIN
SELECT
AssessmentID,
P.PartName, P.PartNo, P.PartTypeID, T.VehiclePartType AS PartType,
AmountClaimed, Price, IsRateOnMRP, GSTRate, GSTAmount, DepreciationRate, DepreciationAmount, AmountAssessed
FROM assessment V
LEFT JOIN cdn.vehicle_parts P ON P.PartID = V.PartID
LEFT JOIN cdn.vehicle_part_types T ON T.VehiclePartTypeID = P.PartTypeID
WHERE RefNo = inRefNo;
END
;;
delimiter ;
Скрипт для таблицы оценки :
CREATE TABLE `assessment` (
`RefNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Reference number to an interim survey',
`AssessmentID` tinyint(3) NOT NULL COMMENT 'Numeric ID assigned to an assessment',
`PartID` smallint(6) NULL DEFAULT NULL COMMENT 'Reference to cdn.vehicle_parts',
`AmountClaimed` int(7) NULL DEFAULT NULL COMMENT 'Amount of claim requested by vehicle owner',
`Price` int(7) NULL DEFAULT 0 COMMENT 'Price of part being assessed, inclusive of GST or execlusive of GST',
`IsRateOnMRP` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Wether rate of part is on MRP - YES | NO',
`GSTRate` tinyint(2) NULL DEFAULT 0 COMMENT 'Percentage of GST on part',
`GSTAmount` smallint(7) NULL DEFAULT NULL COMMENT 'Amount of GST',
`DepreciationRate` tinyint(2) NULL DEFAULT 0 COMMENT 'Percentage of depreciation on part',
`DepreciationAmount` smallint(7) NULL DEFAULT NULL COMMENT 'Amount of depreciation on part',
`AmountAssessed` int(7) NULL DEFAULT NULL COMMENT 'Amount assessed by surveyor (MRP - Depreciation)',
PRIMARY KEY (`RefNo`, `AssessmentID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
Скрипт для таблицы vehicle_parts :
CREATE TABLE `vehicle_parts` (
`PartID` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Numeric ID asigned to the part',
`PartName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Name of the part as per company brochure',
`PartNo` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Part number provided by vehicle manufacturer',
`PartTypeID` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Reference to table: vehicle_part_types',
`VehicleTypeID` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Referene to table: vehicle_types',
`VehicleMakeID` smallint(4) NULL DEFAULT NULL COMMENT 'Reference to table: vehicle_makes',
PRIMARY KEY (`PartID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
Скрипт для таблицы vehicle_part_types :
CREATE TABLE `vehicle_part_types` (
`VehiclePartTypeID` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Single character code for part type',
`VehiclePartType` char(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Type of part',
PRIMARY KEY (`VehiclePartTypeID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
Скрипт для выполнения запроса в PHP:
$dbh->query("CALL GetAssessmentData('$refNo');");
$ dbh - это объект класса, который я создал для доступа к базе данных с использованием PDO. Скрипт для функции query is:
<code>private function query($query, $params){
$result = null;
$stmt = null;
$single_row = null;
$this->open();
try{
$stmt = $this->pdo->prepare($query);
if(!is_null($params)){ # If a parameterized query is to be executed
$this->bindValueArray($stmt, $params);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$rowCount = $stmt->rowCount();
}
catch(PDOException $ex){
$errorDB = $stmt->errorInfo();
$trace = $ex->getTraceAsString();
$this->error = '<b>PDOException: </b><br /><pre>'.print_r($errorDB, TRUE).'<hr />'.$trace.'
«; $ this-> WriteErrorLog ($ query, htmlentities ($ this-> error)); } catch (Exception $ ex) {$ trace = $ ex-> getTraceAsString (); $ this-> error = 'Exception:
'.$ex->getTraceAsString().'
'; $ this-> WriteErrorLog ($ query, htmlentities ($ this-> error)); } $ stmt = NULL; вернуть $ результат; }
Я использую эту функцию с годами. Похоже, что с этим не может быть проблем.
Запрос CALL GetAssessmentData('$refNo');
отлично работает на локальном и удаленном серверах с использованием Navicat, MySQL Workbench и phpMyAdmin.
Но когда я выполняю запрос в моем скрипте PHP, он выдает ошибку:
Неустранимая ошибка: допустимый объем памяти 268435456 байт исчерпан (попытка выделить 307200 байт) в ........
Хостинговая компания предоставила мою 256 МБ оперативной памяти. Таблица оценка содержит только 4 записи. Кроме того, я могу выполнить все остальные более 40 процедур, используя тот же сценарий.