powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
6 сообщений из 6, страница 1 из 1
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157289
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед праздниками открыл топик "курсорная переменная - ошибка "fetch out of sequence"", многое прояснилось, но вопрос так и не столкнул до сих пор! Суть же проблемы такова: нужно извлечь из базы набор строк, сделать с ними определенные манипуляции (изменить по условию значение некоторых полей) и затем отдать на "растерзание" этот набор клиентской программе. Из советов форумщиков и чтива "PL/SQL Collections and Records" сложилось решение, делать надо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
PACKAGE TREST_PACK
  IS
  TYPE TCursor IS REF CURSOR;
  TYPE TTable IS TABLE OF emp%ROWTYPE;  
  FUNCTION function_name RETURN  TCursor;
END;

PACKAGE BODY TREST_PACK
IS
   FUNCTION function_name  RETURN  TCursor
   IS
     cur_get TCursor;
     tbl_get TTable;
   BEGIN
     SELECT * BULK COLLECT INTO tbl_get FROM scott.emp;  -- вот тут все накрывается!
 
     FOR i IN tbl_get.FIRST ..tbl_get.LAST LOOP
      ....
     END LOOP;
     OPEN cur_get FOR SELECT * FROM TABLE (tbl_get);
     RETURN cur_get;     
   END;
END;

но не тут-то было, так не работает, почему же тогда работает так:
Код: plaintext
1.
2.
3.
4.
5.
6.
  TYPE TTable1 IS TABLE OF emp.ename%TYPE;
 ...
  tbl_get1 TTable1;  
BEGIN
  SELECT ename BULK COLLECT INTO tbl_get1 FROM scott.emp;  


Все дело в том, что мне нужны в коллекции строки таблицы, а не отдельный столбец! Как же быть?
...
Рейтинг: 0 / 0
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157334
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пойми же, что pl/sql-таблица и объектный тип-таблица - это две большие разницы, и работать с ними надо по-разному. То, что с обоими ты можешь работать как с массивами, используя методы FIRST, LAST и иже с ними, пусть тебя не смущает. На этом их сходство заканчивается. Из pl/sql-таблицы открыть курсор ты не сможешь, нет сейчас такого синтаксиса. Право, в предыдущем топике ты взял работающий, но некрасивый пример, и, подставив pl/sql-таблицу вместо объектного типа, получил пример "красивый", но неработающий.

Заполнение pl/sql-таблицы можно оформить так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare
  type TTable is table of scott.emp%rowtype;
  tbl_get TTable;
begin
  select * bulk collect into tbl_get from scott.emp;
end;
/


Но на этом ты и остановишся, дальше- читай в документации все, что связано с Object Types, Object Tables, особенно в Oracle9i Application Developer's Guide - Object-Relational Features
...
Рейтинг: 0 / 0
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157446
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, прошу прощения, но мне все как-то не верится..
Однако насчет заполнения таблицы pl/sql: но все равно же такой пример не работает (тот который ты написал)!
...
Рейтинг: 0 / 0
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157464
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть эта фича зависит от версии оракла, я проверял на Oracle9i Enterprise Edition Release 9.2.0.1.0. По-моему в 8i подобное еще невозможно.
...
Рейтинг: 0 / 0
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157480
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну вот, плюс ко всем бедам еще и версия подвела.. :(
все, вобчем подвожу итог собственным мытарствам:
реализовать некую временную таблицу, которая суть выборка, а затем произвести какие-либо манипуляции по этой таблице и вернуть в итоге клиентской проге - представляется плохо реализуемым. Вариант с объектной таблицей плох уж тем, что в ней надо заново описывать каждое поле таблицы, а реализация %rowtype - не реализуется (каламбур, блин).
...
Рейтинг: 0 / 0
TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
    #32157492
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Может быть эта фича зависит от версии оракла, я проверял на Oracle9i Enterprise Edition Release 9.2.0.1.0. По-моему в 8i подобное еще невозможно.

по поводу %rowtype (Oracle8i Enterprise Edition Release 8.1.7.4.1)
...
You cannot bulk-fetch from a cursor into a collection of records, as the following example shows:

DECLARE
TYPE DeptRecTab IS TABLE OF dept%ROWTYPE;
dept_recs DeptRecTab;
CURSOR c1 IS
SELECT deptno, dname, loc FROM dept WHERE deptno > 10;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO dept_recs; -- illegal
...
END;
...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / TYPE ... IS TABLE OF ...%ROWTYPE, да как же это делается-то наконец!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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