2012-01-15 6 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)から(多次元配列を渡す)この手順を使用することができますか?

おかげで、

更新:

これは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次元なので、多次元ではありません。 – kubanczyk

+0

はい、私はtyTestArrayTypesの配列を渡す必要があります: pArr = array(tyTestArrayType、tyTestArrayType、tyTestArrayType ...) – Savash

答えて

1

Iは、入力として、(...の表を使用して)同じストアドプロシージャを開発したと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 

別のオプションは、保存することですテンポラリアレイそこから読み込みます(INパラメータなし)。