首页 > 解决方案 > 如何使用 PHP 从 Oracle 存储函数中获取 OUT 参数作为集合

问题描述

我从所有者那里得到了 Oracle 存储函数(我没有编写函数),看起来像这样

FUNCTION get_customer_data
(
    iref_no_list      IN  t_param_tab,
    ocust_data_list   OUT NOCOPY t_customer_data_tab,
    oerrmsg           OUT VARCHAR2
) RETURN NUMBER;

CREATE OR REPLACE TYPE T_PARAM_TAB force IS TABLE OF t_param_obj;
CREATE OR REPLACE TYPE T_PARAM_OBJ FORCE AS OBJECT 
(
    par_name   VARCHAR2(30),  /*Parameter name*/
    par_value  VARCHAR2(50),  /*Parameter value*/

    MEMBER FUNCTION to_string RETURN VARCHAR2
);

CREATE OR REPLACE TYPE T_CUSTOMER_DATA_TAB IS TABLE OF t_customer_data_obj;
CREATE OR REPLACE TYPE T_CUSTOMER_DATA_OBJ FORCE AS OBJECT
(
  full_name         VARCHAR2(360 CHAR),
  first_name        VARCHAR2(100 CHAR),
  last_name         VARCHAR2(100 CHAR),
  identity_number   VARCHAR2(20 CHAR),
  email             VARCHAR2(255 CHAR), 
  phone_number      VARCHAR2(20 CHAR),

  MEMBER FUNCTION to_string RETURN VARCHAR2
); 

PHP代码看起来像这样

$connection = oci_connect("username", "password", "connect string");

$sql = "DECLARE
           iref_no_list    t_param_tab := t_param_tab(t_param_obj('CA_REF_NO', '1111111111'));
        BEGIN
           :rc := get_customer_data(iref_no_list    => iref_no_list,
                                    ocust_data_list => :output,
                                    oerrmsg         => :message);
        END;";

$stmt = oci_parse($connection, $sql);

$output = oci_new_collection($connection, "T_CUSTOMER_DATA_TAB");

oci_bind_by_name($stmt, ":output", $output, -1, OCI_B_NTY);

oci_bind_by_name($stmt, ":message", $errorMessage, 4000, SQLT_CHR);

oci_bind_by_name($stmt, ":rc", $resultNumber);

oci_execute($stmt, OCI_DEFAULT);

问题是,我就是无法打印出该集合。它返回消息和返回值,但 collection 只返回collection => oci8 collection resource

我试过了

$count = $output->size();
for ($i=0; $i<=$count; $i++) {
   $outputArray[] = $output->getElem($i);
}

但它只是返回false

你知道有什么解决办法吗?谢谢你。

标签: phporacleoci8

解决方案


推荐阅读