【问题标题】:Pass multidimensional array to Oracle stored procedure将多维数组传递给 Oracle 存储过程
【发布时间】:2012-02-10 19:10:20
【问题描述】:

我有自定义类型的 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}

【问题讨论】:

  • 这个数组只有一维,所以不是多维的。
  • 是的,但我需要传递 tyTestArrayTypes 数组:pArr = array(tyTestArrayType,tyTestArrayType,tyTestArrayType...)

标签: php oracle stored-procedures oci8


【解决方案1】:

我开发了一个相同的存储过程(使用...的表)作为输入,并且很难从 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 参数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-12-08
    • 2016-04-27
    相关资源
    最近更新 更多