我的SP有自定义类型:
Create Or Replace Type tyTestArrayType As Object
(siF1 SmallInt,
siF2 SmallInt,
siF3 SmallInt);
Create Or Replace Type tyTestArray Is Table Of tyTestArrayType;
Create Or Replace Procedure prTestArray(pArr tyTestArray,
pResult In Out SmallInt)
Is
Begin
pResult := 0;
For I In 1..pArr.Count
Loop
pResult := pResult + pArr(I).siF1 + pArr(I).siF2 + pArr(I).siF3;
End Loop;
End;
如何从PHP(oci8)中使用此过程(传递多维数组)?
谢谢,
更新
这是在Ruby中执行此操作的代码:
plsql.connection = OCI8.new("user","pass","host/XE")
testArray = [{:sif1 => 1, :sif2 => 12, :sif3=>4},{:sif1 => 5, :sif2 => 2, :sif3=>3}]
puts plsql.prTestArray(p_testArray,0) #=> {:presult=>27}
答案 0 :(得分:1)
我已经开发了一个相同的存储过程(使用Table of ...)作为输入,很难从Java代码调用。所以我切换到CLOB输入并从代码传递XML。 在XML中,您可以根据需要将数组作为多维数据,并且在PHP中构建XML字符串非常容易。
使用ORACLE轻松进行XML解析:
CLOB:
<?xml version="1.0"?>
<DATA>
<LINE>
<COD_NOMCPDT>040001</COD_NOMCPDT>
</LINE>
<LINE>
<COD_NOMCPDT>040002</COD_NOMCPDT>
</LINE>
</DATA>
查询:
SELECT
extractvalue(column_value, '/LINE/COD_NOMCPDT')
FROM TABLE(XMLSequence(XMLTYPE(
CLOB_VARIABLE).extract('/DATA/LINE'))) );
输出:
040001
040002
另一种选择是将数组存储在临时表中并从那里读取(没有IN参数)。