Как устранить ошибку «Неустранимая ошибка: допустимый объем памяти 268435456 байт исчерпан (попытка выделить 307200 байт) в ........» - PullRequest
0 голосов
/ 27 марта 2020

У меня есть хранимая процедура на моем производственном сервере, как показано ниже:

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 процедур, используя тот же сценарий.

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