2012-01-15 52 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參數)。