Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > %rowtype ++


Автор: setnull 27.1.2009, 11:00
Все здравствуйте!!!!

А есть возможность расширить %rowtype, не прибегая к перечислению полей.
К примеру, у меня таблица, содержит n полей. Возможно ли объявить тип, являющийся как бы %rowtype'ом моей таблицы, только седержащий несколько дополнительных полей?

Спасибо!

Автор: Zloxa 27.1.2009, 11:27
Нет.
Да и не надо это.
Код

  type my_record is record(
    rowtype1 all_objects%rowtype
    ,rowtype2 user_objects%rowtype 
  );

Автор: setnull 27.1.2009, 16:52
Так это будет

Код

declare
rec my_record
begin

rec .rowtype1.field1 := value;
rec.add_field := valu2;


?????????


А мне необходимо, чеб они были в "одной плоскости".....

Автор: Zloxa 27.1.2009, 17:18
Цитата(setnull @  27.1.2009,  16:52 Найти цитируемый пост)
Так это будет

Дык ясно ;)

Цитата(setnull @  27.1.2009,  16:52 Найти цитируемый пост)
А мне необходимо, чеб они были в "одной плоскости"

Зачем, если не секрет?
Не могу придумать.

Автор: setnull 28.1.2009, 15:57
Мне необходимо обявиь тип, который в свою очередь будет rowtype'ом для резальтата функции...

Код

TYPE A_ROW IS MY_TABLE%ROWTYPE
TYPE RES_TYPE IS TABLE OF A_ROW;

FUNCTION MY_FUNCTION
RETURN RES_TYPE PARALLEL_ENABLE PIPELINED;



Функция должна возвращать набор "скалярных" записей...
А в A_ROW нужно добавиьт несколько полей

Автор: Zloxa 28.1.2009, 16:25
вариант?
Код

  cursor my_cur is select t.*, cast(null as varchar2(10)) my_varchar from dual t ;
  subtype A_ROW IS my_cur%ROWTYPE;
  TYPE RES_TYPE IS TABLE OF A_ROW;
  FUNCTION MY_FUNCTION
  RETURN RES_TYPE PARALLEL_ENABLE PIPELINED;

Автор: setnull 29.1.2009, 09:50
Конечно, с подвыподвертом, но так даже интересней..... smile 
Спасибо!!!

Автор: setnull 29.1.2009, 11:57
Блин!
Все хорошо, только такая функция с PIPELINED у мя не компилируется....

PLS-00707: unsupported construct or internal error [2603]

в нете говорят - это баг :(


А по другому можно как-нить?

Автор: Zloxa 29.1.2009, 12:16
У меня работает.
Код

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 
 
create or replace package my_pack is
  cursor my_cur is select t.*, cast(null as varchar2(10)) my_varchar from dual t ;
  subtype A_ROW IS my_cur%ROWTYPE;
  TYPE RES_TYPE IS TABLE OF A_ROW;
  FUNCTION MY_FUNCTION
  RETURN RES_TYPE PARALLEL_ENABLE PIPELINED;
end my_pack;
/
 
Package created
create or replace package body my_pack is
  FUNCTION MY_FUNCTION
  RETURN RES_TYPE PARALLEL_ENABLE PIPELINED
  is
  begin
    for i in my_cur
    loop
      pipe row (i);
    end loop;
    return;
  end ;
end my_pack;
/
 
Package body created
select * from table(my_pack.MY_FUNCTION);
 
DUMMY MY_VARCHAR
----- ----------
X     
 

Тоже самое
Код

Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
....
select * from table(my_pack.MY_FUNCTION);
 
DUMMY MY_VARCHAR
----- ----------
X 


Цитата(setnull @  29.1.2009,  11:57 Найти цитируемый пост)
А подругому можно как-нить? 

Брать RowType вьюхи?
Я чесгря так и не понял зачем это надо.
Что мешает честно объявить Record?

Добавлено через 6 минут и 52 секунды
Цитата(Zloxa @  29.1.2009,  12:16 Найти цитируемый пост)
У меня работает.

ХМ.... Попытка заменить dual на реальную таблицу привела к той же ошибке :((

Автор: setnull 5.2.2009, 11:57
Цитата(Zloxa @ 29.1.2009,  12:16)
Что мешает честно объявить Record?

да ничто и не мешает....

просто в дальнейшем при добвлении полей в таблицу приходится расачить по всей базе и выискивать, где же это поле необходимо продублировать... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)