В PHP получить OUT-параметр типа ассоциативный массив

Vorobeika

Guest
В PHP получить OUT-параметр типа ассоциативный массив

Есть некий
PHP:
type map is table of varchar2(32767) index by varchar2(256);
Есть хранимая процедура с out параметром типа map. Хочется получить его значение и разобрать в PHP.

Подозреваю, что можно как-то использовать collection, но не представляю, как.

PHP:
$my_map = OCINewCollection($c,"??????") //???????

$dynsql = "begin some_procedure(:OUT_MAP) end;"
$stmt = OCIParse($c,$dynsql);
OCIBindByName($stmt,":OUT_MAP",$my_map,-1,OCI_B_NTY);
// etc.
Возможно ли изобразить что-то в таком роде? Какой тип надо указывать для создания коллекции?
 

tony2001

TeaM PHPClub
$my_map = OCINewCollection($c,"map");
или
$my_map = OCINewCollection($c,"scheme.map"); //scheme - схема, где определен тип map
 

Vorobeika

Guest
В ответ на
PHP:
$my_map = OCINewCollection($c,"packagename.map")
получаю
Warning: ocinewcollection(): OCITypeByName: OCI-22303: type ""."packagename.map" not found in /home/vorobeika/public_html/process.php on line 108

Та же реакция на schemename.packagename.map

:(
 

tony2001

TeaM PHPClub
я прошу прощения:
там не схема, а пакадж, если тип не глобальный для всей схемы.
схема - третий параметр у функции.
в мануале уже смотрел? тип где создан?
 

Vorobeika

Guest
Тип создан так:

PACKAGE mypackage
IS
type map is table of varchar2(32767) index by varchar2(256);
//etc.
function myfunction(outmap out map)return number;
END;

То есть sql такой:
PHP:
$dynsql = "begin :P_RESULT := mypackage.myfunction(:OUT_MAP); end;";
В мануалах, да и в архивах различных форумов мне не удалось найти нужное насчет ассоциативных массивов.
Я, признаюсь, пока чайник, что в Oracle, что в PHP. И нет никакой уверенности, что надо здесь использовать именно collection, просто предположение. Хочется понять хотя бы, в какую сторону рыть.
 

tony2001

TeaM PHPClub
PHP:
$collection = ocinewcollection($c, "mypackage.map", "scheme"); // тогда так должно работать.
 

Vorobeika

Guest
Не работает :(
Теперь вообще непонятно, почему. Уже забыли про ассоциативный, создали просто
type map is table of varchar2(32767);
PHP:
$my_map = OCINewCollection($c,"mypackage.map","ddbe");
По-прежнему
Warning: ocinewcollection(): OCITypeByName: OCI-22303: type "ddbe"."mypackage.map" not found in /home/vorobeika/public_html/process.php on line 108

Из-за чего вообще такое бывает? :(
Все названия и кейсы совпадают, схема одна и та же...
 

tony2001

TeaM PHPClub
теперь в uppercase напиши всё это.
Оракл любит верхний регистр.
 

Vorobeika

Guest
Кейсы не помогают. Испробованы разные варианты...

Если найду, в чем дело, напишу.
 

tony2001

TeaM PHPClub
у меня всё работает:
Код:
create type map as table of varchar2(100);
PHP:
$conn = ocilogon('adw_server','passwd','server');
$coll = ocinewcollection($conn, 'MAP', 'ADW_SERVER');
var_dump($coll);
выводит:
Код:
object(OCI-Collection)#1 (1) { ["collection"]=> resource(3) of type (oci8 collection) }
 

Vorobeika

Guest
Хм.
Так у меня тоже получается.
А вот для типа, который в package - нет!
Может быть для этого в принципе невозможно использовать тип из package?
 

tony2001

TeaM PHPClub
да, придется создавать тип глобально.
к сожалению, это похоже на жесткое ограничение OCI.
OCITypeByName(); (которая ищет тип) не знает ничего о пакаджах, только 2 строковых параметра - имя типа и схема.
 
Сверху