2012-01-15 80 views
2

我有SP自定义类型:传递多维数组Oracle存储过程

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)这个程序(通过多维数组)?

谢谢,

更新:

这是红宝石执行此代码:作为输入

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

该数组有一个维度,所以它不是多维的。 – kubanczyk 2012-01-15 19:48:02

+0

是的,但我需要传递tyTestArrayTypes的数组: pArr = array(tyTestArrayType,tyTestArrayType,tyTestArrayType ...) – Savash 2012-01-16 11:34:39

回答

1

我已经developped相同的存储过程(使用的表...)和Java代码很难被调用。所以我切换到CLOB输入并从代码传递了一个XML。 在XML中,您可以根据需要使用多维数组,并且使用PHP构建XML字符串非常容易。

XML解析变得更为简便ORACLE:

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 

另一个选项是存储数组在一个模块中porary table并从那里读取它(没有IN参数)。