Как правильно обработать эту ошибку в моей хранимой процедуре? - PullRequest
1 голос
/ 11 ноября 2011

Из PHP я вызываю хранимую процедуру SQL. Хранимая процедура проверяет базу данных и либо вставляет данные, если они новые, либо изменяет данные, которые уже существуют.

Я получаю сообщение об ошибке, что один из моих параметров имеет неправильный тип данных. Я не могу контролировать это из-за того, откуда поступают данные. Я вызываю хранимую процедуру сотни или тысячи раз, просматривая массив данных, и получаю эту ошибку только для нескольких записей из пакета.

Как правильно обрабатывать эту ошибку в хранимой процедуре? Если какой-либо из параметров имеет неправильный тип данных, я просто хочу пропустить эту запись и перейти к следующей записи. Каждый вызов происходит из цикла foreach.

База данных сообщает об ошибке, и PHP отображает ее. У меня нет опыта работы с ошибками.

Пример PHP-кода:

foreach($item_array as $item) {
    $id = $item['id'];
    $color = $item['color'];

    $con = connect()
    $query = 'EXECUTE PROCEDURE sp_update_db(:id, :color);'
    $params = array(':id' => $id, ':color' => $color);
    $stmt = prepare($con, $query);

    $result = execute($stmt, $params);

    close($con);
}

Запустив код, который я получаю, «Предупреждение: ошибка SQL: [хранимая процедура имеет неверный тип данных»].

1 Ответ

0 голосов
/ 11 ноября 2011

Мне кажется, что ваш процесс даже не выполняется из-за неправильной передачи параметра;Вы можете справиться с этим только в своем php-коде, поймав исключение.

Если на самом деле вызывается процедура, но просто происходит сбой внутри процедуры из-за какого-то несоответствия типов данных, вы можете использовать

BEGIN TRY
    -- your proc statements here
END TRY
BEGIN CATCH
END CATCH

Документация здесь.

ОБНОВЛЕНИЕ

Поскольку вы сказали, что вызываете proc один раз для каждой записи, которую вам нужно обработать, вам нужно отловить ошибку на стороне PHP.Вы можете использовать try/catch блоки на PHP. Смотрите здесь .

По сути, вам нужно иметь блок try/catch внутри цикла foreach, охватывающий только ту часть, которая вызывает хранимую процедуру; однако , перед вызовом хранимой процедуры я бы просто написал оператор if, который гарантирует, что все параметры, которые будут переданы в процесс, имеют ожидаемый тип и длину.Например, если хранимая процедура требует параметр @a типа int, я бы вообще запретил вызывать proc, если передаваемый параметр не является числом или пустой строкой.

ОБНОВЛЕНИЕ 2

Основано на примере php (Внимание: я не программист PHP), похоже, это будет работать:

try{
    $result = execute($stmt, $params);
}
catch (Exception $e) {
}

Но опять же, если вы знаете типы данных, ожидаемые процедурой, почему бы не иметь if вместо try/catch?

...