首页 > 解决方案 > 如何在php中绑定oracle关联数组?

问题描述

我在 php 中有一个具有复杂类型请求的方法。在我的方法中,我必须将请求绑定为接收关联数组的 oracle 过程/函数中的参数。

我尝试使用 oci_bind_array_by_name。

class ExampleRequest   {
    /**
     * @soap
     * @var string
     */
    public  $Email;    
    /**
     * @soap
      * @minOccurs 0
     * @var ExampleItem[]
     */
    public  $ExampleItems;
}

class ExampleItem  {
    /**
     * @soap
     * @var string
     */
    public $Type;    
    /**
     * @soap     
     * @var integer
     */
    public $Points;    
}

//Test(ExampleRequest) 
public function Test($request)
    {
...
$sql = "BEGIN PROCEDURE_TEST(:p1, :p2, :p3);END;";
$res = oci_parse($this->dbCon, $sql);
oci_bind_by_name($res, ":p1", $request->Email);
oci_bind_array_by_name($res, ":p2", $request->ExampleItems->Type,count($request->ExampleItems->Type), -1, SQLT_CHR);
oci_bind_array_by_name($res, ":p3", $request->ExampleItems->Points,count($request->ExampleItems->Points), -1, SQLT_INT);
if (!oci_execute($res)){
   throw new SoapFault(4, "Internal server error");
}
...
}
$request = new ExampleRequest();
$request->ExampleItems= new ExampleItem();
$request->Email = "example@outlook.com";  
$request->ExampleItems->Type= array('A','B');
$request->ExampleItems->Points= array('587', '19'); 
$client->Test($request);
TYPE array1 IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
TYPE array2 IS TABLE OF NUMBER(10) INDEX BY PLS_INTEGER;

PROCEDURE_TEST(p_email IN VARCHAR2, p_type IN array1, p_points IN array2) IS 
BEGIN
  DELETE FROM TEMP;
  FOR i IN 1 .. p_type.COUNT
  LOOP
     INSERT INTO TEMP (x1, x2, x3)
     VALUES (p_type(i), p_points(i), i);
  END LOOP;
  COMMIT;

  FOR cnt IN (SELECT TBL.ID ID_TBL, TMP.X1, TMP.X2 FROM TABLEA TBL, TEMP TMP WHERE TBL.TYPE = TEMP.X1)
  LOOP
     UPDATE TABLEA SET CODE = CODE + cnt.X2 WHERE ID = cnt.ID_TBL;
     COMMIT;
   END LOOP;
  DELETE FROM TEMP;

END;

执行时发生错误,因为不幸的是执行了 SoapFault 行并且我收到错误:object(SoapFault)#4...

标签: phporaclebindingassociative-arrayoracle-call-interface

解决方案


推荐阅读