Передача многомерного массива в хранимую процедуру Oracle - PullRequest
2 голосов
/ 15 января 2012

У меня 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}

1 Ответ

1 голос
/ 08 мая 2012

Я разработал идентичную хранимую процедуру (используя Таблицу ...) в качестве входных данных, и было трудно вызвать ее из кода Java. Поэтому я переключился на ввод CLOB и передал XML из кода. В XML у вас может быть многомерный массив, какой вы пожелаете, и очень просто создать строку XML в PHP.

С помощью 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).

...