简体   繁体   English

为什么PHP的OCI8 / Oracle oci_bind_array_by_name对我不起作用?

[英]Why is PHP's OCI8/Oracle oci_bind_array_by_name not working for me?

I'm trying to bind a php variable to pl/sql array. 我正在尝试将PHP变量绑定到pl / sql数组。 The pl/sql procedure works fine when I execute it manually and set the bind, so I know that's not the problem. 当我手动执行并设置绑定时,pl / sql过程可以正常工作,因此我知道这不是问题。 It's the oci_bind_array_by_name that is causing problems. 这是oci_bind_array_by_name ,是造成问题。

I get the following error message for the line in the PHP code below where I call the oci_bind_array_by_name function: 我在下面的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

I'm confused because I am in fact providing a max length (250) in the function call per the documentation: 我很困惑,因为实际上我根据文档在函数调用中提供了最大长度(250):

http://php.net/manual/en/function.oci-bind-array-by-name.php I'm using PHP 5.1.6 http://php.net/manual/zh/function.oci-bind-array-by-name.php我正在使用PHP 5.1.6

Here is the relevant PHP code: 以下是相关的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);

I have an array type defined in the package: 我在包中定义了一个数组类型:

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;

And I feel like a fool because I did not read the API closely enough. 而且我觉得自己很傻,因为我没有足够仔细地阅读API。 Apparently I was specifying the max_table_length but the error message was referring to the max_item_length which I left as -1... but that's a no-no since I'm binding an OUT parameter instead of an IN one. 显然我指定的是max_table_length,但错误消息指向的是我留为-1的max_item_length ...但这是不行,因为我绑定的是OUT参数而不是IN参数。

Changed the bind like so and it now works: 像这样更改了绑定,它现在可以工作:

oci_bind_array_by_name($stmt,'USER_ID_ARRAY', $userIdArray, 250, 250, SQLT_VCS);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM