Почему PHP OCI8/Oracle OCI_BIND_ARRAY_BY_NAME не работает для меня?

StackOverflow https://stackoverflow.com/questions/2960512

  •  23-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь связать переменную PHP с массивом PL/SQL. Процедура PL/SQL работает нормально, когда я выполняю ее вручную и устанавливаю привязку, поэтому я знаю, что это не проблема. Это oci_bind_array_by_name Это вызывает проблемы.

Я получаю следующее сообщение об ошибке для строки в коде PHP ниже, где я называю oci_bind_array_by_name Функция:

Warning: oci_bind_array_by_name() [function.oci-bind-array-by-name]: You must provide max length value for empty arrays

Я в замешательстве, потому что на самом деле я предоставляю максимальную длину (250) в вызове функции по документации:

http://php.net/manual/en/function.oci-bind-array-by-name.phpЯ использую php 5.1.6

Вот соответствующий код PHP:

$SQL = "BEGIN MYPKG.PROCESS_USERS(:USER_ID_ARRAY); END;";

$conn = self::getConnection();
$stmt = OCIParse($conn, $SQL);
$userIdArray= array(); /*I've also tried not initializing the OUT array (same error)
If I put some dummy value into the $userIdArray the procedure will run fine, but the results afterward will contain only that dummy value and not the output of the procedure*/
oci_bind_array_by_name($stmt,'USER_ID_ARRAY', $userIdArray, 250, -1, SQLT_VCS);

У меня есть тип массива, определенный в пакете:

TYPE USER_ID_ARRAY IS TABLE OF VARCHAR2(250) INDEX BY BINARY_INTEGER;

The PROCESS_USERS function in an abbreviated form:
PROCEDURE PROCESS_USERS(p_userIdArray out USER_ID_ARRAY) AS
  --Code here which processes all waiting users and returns their IDs in p_userIdArray
END PROCESS USERS;
Это было полезно?

Решение

И я чувствую себя дураком, потому что я не читал API достаточно внимательно. По -видимому, я указывал max_table_length, но сообщение об ошибке относилось к max_item_length, которое я оставил как -1 ... но это нет -нет, так как я связываю параметр Out вместо одного.

Изменил привязку, как и сейчас, и теперь работает:

oci_bind_array_by_name($stmt,'USER_ID_ARRAY', $userIdArray, 250, 250, SQLT_VCS);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top