php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #47081 OCI-Collection returns null for object array
Submitted: 2009-01-12 23:26 UTC Modified: 2009-03-13 23:41 UTC
Votes:3
Avg. Score:5.0 ± 0.0
Reproduced:3 of 3 (100.0%)
Same Version:3 (100.0%)
Same OS:2 (66.7%)
From: lan dot zhou at emagineinternational dot com Assigned: sixd (profile)
Status: Not a bug Package: OCI8 related
PHP Version: 5.2.8 OS: windows
Private report: No CVE-ID: None
 [2009-01-12 23:26 UTC] lan dot zhou at emagineinternational dot com
Description:
------------
I have a procedure which returns an object array. When I call this procedure from PHP, and bind an OCI-Collection type object to that output parameter, the PHP object contains the right number of the elements after executing the procedure, but all the elements are NULL.

Reproduce code:
---------------
$nty = oci_new_collection($db, 'objectArray');

$stmt = oci_parse($db, 'BEGIN getObjectArray(output); END;');

oci_bind_by_name($stmt, 'output', $nty, -1, OCI_B_NTY);

oci_execute($stmt, OCI_DEFAULT);

for ($i = 0, $len = $nty->size(); $i < $len; $i++) {
    var_dump($nty->getElem($i));
}

$nty->free();

oci_commit($this->_db);

Expected result:
----------------
the content of the objects in the object array which is returned from the procedure ( the return array is not null when I executed the procedure in sql developer)

Actual result:
--------------
NULL

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-01-13 20:07 UTC] sixd@php.net
Can you upload the SQL script to create the type and procedure?
 [2009-01-14 05:16 UTC] lan dot zhou at emagineinternational dot com
CREATE OR REPLACE
TYPE PERSON_TYPE
AS OBJECT ( ID NUMBER(10), NAME VARCHAR2(50), AGE NUMBER,
  CONSTRUCTOR FUNCTION PERSON_TYPE
  RETURN SELF AS RESULT);


CREATE OR REPLACE
TYPE BODY PERSON_TYPE AS
  CONSTRUCTOR FUNCTION PERSON_TYPE
    RETURN SELF AS RESULT
  AS
  BEGIN
    RETURN;
  END;
END;


CREATE OR REPLACE
TYPE ARRAY_PERSON_TYPE IS TABLE OF PERSON_TYPE;
 [2009-01-14 05:18 UTC] lan dot zhou at emagineinternational dot com
CREATE OR REPLACE PROCEDURE GET_PERSON (PARRAY OUT ARRAY_PERSON_TYPE) AS
 ARRPERSON ARRAY_PERSON_TYPE := ARRAY_PERSON_TYPE();

 FUNCTION CREATEPERSON (ID NUMBER, NAME VARCHAR2, AGE NUMBER) 
  RETURN PERSON_TYPE IS
    PERSON PERSON_TYPE := PERSON_TYPE();
 BEGIN
    PERSON.ID := ID;
    PERSON.NAME := NAME;
    PERSON.AGE := AGE;
    RETURN PERSON;
 EXCEPTION WHEN OTHERS THEN
  NULL;    
 END;    

BEGIN
 ARRPERSON.DELETE;
 ARRPERSON.EXTEND(2);
 ARRPERSON(1) := CREATEPERSON(1, 'LAN', 27);
 ARRPERSON(2) := CREATEPERSON(2, 'ZHOU', 72);
 PARRAY := ARRPERSON;
EXCEPTION WHEN OTHERS THEN
END;
 [2009-01-20 04:06 UTC] lan dot zhou at emagineinternational dot com
any feedback on this issue?

thanks
 [2009-03-13 23:41 UTC] sixd@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

This is a known limitation of OCI8.  Code patches to improve this area are welcome. Consider using a mapping function to create a simple types or a varray.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu May 02 09:01:28 2024 UTC