powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / REF CURSOR -> Объектаня таблица
3 сообщений из 3, страница 1 из 1
REF CURSOR -> Объектаня таблица
    #32184273
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял, промежуточные результаты выборки удобнее всего передавать их функций и ХП в виде REF CURSOR или объектной таблицы. Каким способом можно эффективно передать данные из REF CURSOR в объектную таблицу?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 1 .Select -> Object table (temp, тип TempType )
select cast(multiset(select * from MyTable) as TempType) into temp from dual;
 2 . Select -> REF CURSOR
open cur for
select * from MyTable
 3 . Object table -> REF CURSOR
open cur for
select * from table (cast(temp as TempType));
 4 . REF CURSOR -> Object table
?????


ЗЫ: CREATE GLOBAL TEMPORARY TABLE - все же создается реально в БД, а следовательно работа с ней медленнее чем с объектной таблицей?
...
Рейтинг: 0 / 0
REF CURSOR -> Объектаня таблица
    #32184341
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то непонятно, как работать с объектной таблицей. Есть тип объектной таблицы:
Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE TYPE IdRecType AS OBJECT (F_ID number);
GO
CREATE OR REPLACE TYPE IdTblType AS TABLE OF IdRecType;
GO

Есть функция, возвращающая объектную таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION FGetObjIdByObjDefId(ObjDefId IN number)
RETURN IdTblType
IS 
temp IdTblType;
BEGIN
SELECT CAST(MULTISET(SELECT F_OBJID FROM TObject 
WHERE F_OBJTYPEID = ObjDefId AND F_VERSION= 0 ) as IdTblType) INTO temp FROM dual;
RETURN(temp);
END;

1. Как теперь проверить ее работу? Если бы возвращался REF CURSOR, достаточно было в SQL+ набрать:
Код: plaintext
1.
select FGetObjIdByObjDefId( 23 ) from dual;

2. Как правильно использовать результат такой функции в ХП, т.е. нужно что-то типа (на самом деле код ХП гораздо сложнее, это вариант для примера):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE PROCEDURE TestProc(Cur OUT CPack.TCursor)
AS 
temp IdTblType;
BEGIN
temp := FGetObjIdByObjDefId( 23 );
open Cur for
select a.* from TTable2 a
INNER JOIN temp b ON a.F_ID=b.F_ID;
END;

Как это сделать?
...
Рейтинг: 0 / 0
REF CURSOR -> Объектаня таблица
    #32184363
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый вопрос по-прежнему не знаю как ответить, а вот на второй - получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE PROCEDURE TestProc (Cur OUT CPack.TCursor)
AS
temp IdTblType;
BEGIN
temp := FGetObjIdByObjDefId( 23 );
open Cur for
select a.* from TAttr a
inner join table (cast(temp as IdTblType)) b ON a.F_ATTRID=b.F_ID;
END;


Гуру Oracle! Отзовитесь! Очень нужно ваше мнение: насколько вышеописанный способ работы с промежуточными результатами выборки эффективен (т.е. когда получаем выборку из ХП, которая сама использует функции, возвращающие выборки).
Чего все молчат-то?!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / REF CURSOR -> Объектаня таблица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]