Как объединить два курсора?

Просто
Дата: 26.02.2007 10:49:33
Type THistErr is Table of HistErr%RowType; -- HistErr - это таблица

function UnionRows(pInCursor1 in THistErr, pInCursor2 in THistErr)
    return THistErr pipelined is
    vRes THistErr;
begin
  open vRes for
  select * from pInCursor1
  union
  select * from pInCursor2;

  return vRes;
end;

Это не работает - на строку "open vRes for" ругается "PLS-00456: item 'VRES' is not a cursor"

Когда я пробую это объединение запихнуть в кусор
  function UnionRows(pInCursor1 in THistErr, pInCursor2 in THistErr)
    return THistErr pipelined is
    
    cursor xx is
    select * from pInCursor1
    union
    select * from pInCursor2;
    
    vRes THistErr;
  begin
    open vRes for xx;

    return vRes;
  end;

ругается на "select * from pInCursor1" - "table or view does not exist".

Как это правильно написать?
padavan
Дата: 26.02.2007 10:56:38
может курсором выбирать не из таблиц, а из вьюхи?
contr
Дата: 26.02.2007 11:11:12
Автор, Вы не понимаете основ PL/SQL.
Application Development Guide должен быть весьма актуален.
arhey
Дата: 26.02.2007 12:28:46
Type THistErr is Table of HistErr%RowType; -- HistErr - это таблица
вот это курсор ????
действительно почитайте матчасть.
sergey888
Дата: 26.02.2007 14:01:41
А может стоит сначала написать запрос, объединяющий 2 таблицы?
atsygan
Дата: 26.02.2007 14:28:04
Ну вот человек пришел с вопросом, а вы накинулись =)
Хотя конечно совет про мат часть оочень актуален
код изобилует ошибками

function UnionRows(pInCursor1 in THistErr, pInCursor2 in THistErr)
return THistErr pipelined is

cursor xx is
select * from pInCursor1 !!! Так писать нИИИИИзя потому что это не Oracle Table
а всего лись грубо говоря массив данных неограниченной длинны
такие штуки можно указывать в запросе, только с вызовом специального метода + PIPELINED функции, к примеру
код может выглядеть так: select * from TABLE(GetPInCursor1_ROWS)
вообщем доку посмотри, не все так сложно
union
select * from pInCursor2;

vRes THistErr;
begin
open vRes for xx;

return vRes; !!! Для PIPELINED функций используется RETURN + PIPE ROW
end;
Просто
Дата: 26.02.2007 15:13:32
sergey888
А может стоит сначала написать запрос, объединяющий 2 таблицы?


Это одна и та же таблица. Смысл в том, что в таблице много строк, и надо выбрать строки по дате - на вход подаётся интервал дат. Я пробовал секционировать по этому полю, но это принесло выигрыш по скорости всего лишь где-то около 20%, т.к. по этому полю есть индекс, и секционирование с точки зрения чтения по этому полю просто немного уменьшает количество уровней в двоичном дереве - как в случае несекционированного индекса, так и в случае секционированного.
Поэтому я хотел сделать так - считывать из таблицы данные за день в цикле по интервалу. Вариант с временной таблицей, куда складываются результаты, начальник забраковал, т.к. он считает нерациональным делать временную таблицу для решения этой задачи.
С синтаксисом я разобрался, но так и не понял, как организовать цикл с использованием функции
function OneDay(pDate in Date) return THistErr pipelined;
который бы объединял данные по всем дням заданного интервала.
alex-ls
Дата: 26.02.2007 15:42:52
так надо всего лишь раздвоить строки?
Просто
Дата: 26.02.2007 15:45:01
alex-ls
так надо всего лишь раздвоить строки?


Не понял, что Вы имеете в виду.
alex-ls
Дата: 26.02.2007 15:47:06
Просто
alex-ls
так надо всего лишь раздвоить строки?


Не понял, что Вы имеете в виду.

вот это

Просто
sergey888
А может стоит сначала написать запрос, объединяющий 2 таблицы?


Это одна и та же таблица.