Получите доступ к типу varray, определенному внутри пакета, используя oci_new_collection - PullRequest
0 голосов
/ 04 февраля 2011

Здравствуйте. Я пытаюсь передать переменные из PHP в Oracle.Я использую OCI8 и ранее работал с массивами в качестве аргументов в хранимых процедурах, и при компиляции создаются типы этих массивов.Поэтому, создавая экземпляр коллекции на стороне PHP, мы можем напрямую упомянуть имя коллекции.

Пример:

$my_coll = oci_new_collection($c, 'MY_ARRAY');

где MY_ARRAY будет типом массива, который я объявил в экземпляре Oracle.

create or replace type MY_ARRAY as varray(100) of varchar2(20);

Поэтому, когда я создаю их вне пакета, тип компилируется и будет готов во время выполнения.

Если я сделаю это из пакетов, я получаю сообщение об ошибке

Предупреждение PHP: oci_new_collection () [function.oci-new-collection]: OCI-22303: тип "". "My_pack.my_array_type" не найден

Заголовок моего пакетабудет выглядеть так

create or replace
PACKAGE my_pack
AS
   TYPE my_array_type is VARRAY(200) of varchar2(20);
    my_arr my_array_type;

    function my_func(
    in_id number,
    in_arr my_array_type    
    )
    return number;

end my_pack;

Теперь, когда я звоню из PHP, чтобы создать экземпляр коллекции, я делаю это так

$my_collection = oci_new_collection($connect,'my_pack.my_array_type');

Теперь я получаю предупреждение типа ненайдено.

Мой вопрос: как мне вызвать тип varray, который находится в пакете ???Я делаю это как package.type_name, но получаю предупреждение о том, что type not found.

Ответы [ 2 ]

0 голосов
/ 01 августа 2012

Это работает для меня:

$in_arr = array('1','2','3');    
$s = ociparse($database, "BEGIN my_pack.my_func(:in_id, :in_arr); END;");
oci_bind_by_name($s, ':in_id', $in_id, 32 );
oci_bind_array_by_name($s, ':in_arr', $in_arr, 250, -1, SQLT_VCS);

Если вам нужно:

$out_arr = array(); //OUT   
$s = ociparse($database, "BEGIN my_pack.my_func(:in_id, :out_arr); END;") ;
oci_bind_by_name($s, ':in_id', $in_id, 32);
oci_bind_array_by_name($s,':out_arr', $out_arr, 250, 250, SQLT_VCS);
                                                     // change -1 for 250
0 голосов
/ 04 февраля 2011

Попробуйте передать схему и имя типа в верхнем регистре

oci_new_collection($connect,'MY_PACK.MY_ARRAY_TYPE', 'MY_SCHEMA')

Upd.

Я не нашел никаких ограничений в справочнике OCI, но PL \ SQL Reference былболее информативно:

Составной тип PL / SQL, определенный в спецификации пакета, несовместим с идентично определенным локальным или автономным хранимым типом

Также из PL \ SQL Reference (Таблица 5-1) Все виды коллекций имеют ограничения.Например, VARRAY, объявленный на уровне пакета:

Может быть типом данных атрибута ADT, только если он определен на уровне схемы

...