PHP Функция привязки oci_bind_by_name возвращает параметр с -1 не работает - PullRequest
0 голосов
/ 03 июля 2019

Я пытался связать переменную $result для хранимой функции PL / SQL, но это не работает, если я связываю $result переменную как

oci_bind_by_name($stmt, ':result', $result, -1);

и выдает сообщение об ошибке как:

oci_execute (): ORA-06502: PL / SQL: ошибка с числовым значением или значением: слишком маленький буфер строки символов

Также работает для оператора if как:

oci_bind_by_name($stmt, ':result', $result, 1000);

Но хранимая функция My PL / SQL возвращает большое количество данных, поэтому я хочу использовать максимальную длину как -1.

Справочная форма: https://www.php.net/manual/en/function.oci-bind-by-name.php

1) максимальная длина Устанавливает максимальную длину для данных. Если вы установите его на -1, эта функция будет использовать текущую длину переменной, чтобы установить максимальную длину. В этом случае переменная должна существовать и содержать данные при вызове oci_bind_by_name ().

2) Пример # 10 Связывание для хранимой функции PL / SQL.

$sql = 'BEGIN :result := QUERY(:parameters); END;';      
$stmt = oci_parse($this->oracle_db->conn_id,$sql);   
oci_bind_by_name($stmt,':parameters',$parameters);   
oci_bind_by_name($stmt, ':result', $result, -1);   
oci_execute($stmt);   
oci_free_statement($stmt);   
oci_close($this->oracle_db->conn_id);   

Сообщение об ошибке:

oci_execute (): ORA-06502: PL / SQL: ошибка числового значения или значения: слишком маленький буфер строки символов

1 Ответ

0 голосов
/ 04 июля 2019

Вам нужно указать длину, чтобы OCI8 знал, сколько памяти выделить, прежде чем он вызовет базу данных. В противном случае вы полагаетесь на $result, имеющее значение перед вызовом oci_execute(); длина $result до вызова oci_execute() будет максимальным разрешенным размером для возврата. Я бы всегда рекомендовал передавать размер до oci_bind_by_name(), чтобы не было неприятных неожиданных усечений.

...