Ошибка запуска функции с переменным Clob in Out (PHP, Oracle, Laravel) - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть приложение, разработанное с помощью фреймворка Laravel php. И я использую следующий пакет для работы с моей базой данных Oracle. https://github.com/yajra/laravel-oci8

У меня есть следующая функция в Oracle:

function my_func(uid in number, json in out nocopy clob) return number is

И в php я называю это

$result = '';

$pdo = DB::connection('oracle')->getPdo();

$stmt = $pdo->prepare("begin :result := my_func(:uid, :json); end;");
$stmt->bindParam(':result', $result, \PDO::PARAM_INT);
$stmt->bindParam(':uid', $uid, \PDO::PARAM_INT);
$stmt->bindParam(':json', $json, \PDO::PARAM_STR, 1000000);
$stmt->execute();

return response()->json(json_decode($json), ($result === 1) ? 200 : 
400);

Когда вывод 'json' меньше 32767 символов, тогда код работает. Но когда оно больше, возникает следующее исключение:

Oci8Exception {#615
#message: """
Error Code : 6502\n
Error Message : ORA-06502: PL/SQL: erro numérico ou de valor\n

Сведения о системе Oracle 11g

Ubuntu 18.04

PHP 7,2

Laravel 5.5

Laravel-OCI8 5.5

1 Ответ

0 голосов
/ 17 сентября 2018

Мне удалось разработать решение.Не уверен, что это лучше, но это сработало.

$result = $lob = '';

$pdo = DB::connection('oracle')->getPdo();

$stmt = $pdo->prepare("declare v_uid number(10) := :uid; v_data clob := :data; begin :result := my_func(v_uid, v_data); :lob := v_data; end;");

$stmt->bindParam(':result', $result, \PDO::PARAM_INT);
$stmt->bindParam(':uid', $uid, \PDO::PARAM_INT);
$stmt->bindParam(':data', $data, \PDO::PARAM_STR);
$stmt->bindParam(':lob', $lob, SQLT_CLOB);
$stmt->execute();

$json = $lob->read($lob->size());

return response()->json(json_decode($json), ($result === 1) ? 200 : 400);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...