функция, возвращающая ref cursor

jakata

Guest
функция, возвращающая ref cursor

Помогите, пожалуйста, решить проблему, которая мучает второй день.

У меня на PL/SQL есть функция, результат которой REF CURSOR.
Всё это хранится в пакете:

--тип записи, в которой хранится информация об операции
TYPE t_Route_Rec IS RECORD (
Oper_Name operation.oper_name%TYPE,
Oper_Duration operation.oper_duration%TYPE
);

--тип ссылка на курсор, возвращающий список операций
TYPE t_Operations IS REF CURSOR
RETURN t_Route_Record;

--функция, принимающая ID маршрута
--и возвращающая курсор
FUNCTION GetOperations(p_Route_Id route.route_id%TYPE) RETURN t_Operations;

В функции открываю курсор для селекта по полученному ID и возвращаю его (ссылку на курсор).

Как мне теперь в php сделать грамотно привязку возвращаемого курсора и переменной php. И какого типа будет эта переменная и как мне профетчить полученные значения из курсора (хотя с этим, вроде, и понятно). И самое главное - как мне закрыть этот курсор?

И грамотно ли вообще так делать (открывать курсор в одном месте, а закрывать в другом).

Вроде, oci_new_cursor то что нужно. Но я не поняла, как мне профетчить данные в html-таблицу.
 

Falc

Новичок
[m]oci_new_cursor[/m]
См. пример.

>>как мне профетчить данные в html-таблицу
[m]oci_fetch_all[/m]
Для начала можно вытащить данные в массив.

-~{}~ 12.05.05 12:24:

Да и еще, я к примеру из оракла данные возвращаю в виде xml'я в одном clob'e.
Т.е. курсор превращаю в хмл с помошью:
xml_hendler := dbms_xmlGen.newContext(sys_refcursor);
Return dbms_xmlGen.getXml(xml_hendler);

А на php вытаскиваю clob и с помошью simplexml вывожу данные.

Работает гораздо быстрее чем фетчить курсор.
 

ast-ross

Новичок
А как работать через oci с вложенными курсорами?
Пример из мана
PHP:
<?php   
// suppose your stored procedure info.output returns a ref cursor in :data

$conn = oci_connect("scott", "tiger");
$curs = oci_new_cursor($conn);
$stmt = oci_parse($conn, "begin info.output(:data); end;");

oci_bind_by_name($stmt, "data", $curs, -1, OCI_B_CURSOR);
oci_execute($stmt);
oci_execute($curs);

while ($data = oci_fetch_row($curs)) {
    var_dump($data);
}
 
oci_free_statement($stmt);
oci_free_statement($curs);
oci_close($conn);
?>
Работает на ура но с обычным курсором, а вот с вложенным ругается на неверный тип данных...
 
Сверху