Oracle: вернуть набор результатов из CTE из встроенной табличной функции.

Я могу получить аналогичную функцию, работающую в TSQL, но я относительный новичок в PL/SQL, и я надеюсь, что кто-нибудь объяснит мне, почему объявление этой функции не будет компилироваться.
t_interval_list_table — это табличный тип объектов t_interval который имеет единственный атрибут varchar2(20). Interval_Get_udf просто возвращает отформатированную строку типа varchar(2)

create or replace
FUNCTION  fn_ExplodeIntervals (
  startTime IN timestamp,
  endTime IN timestamp,
  inputInterval IN int)
  RETURN t_interval_list_table   AS  intervalList t_interval_list_table := t_interval_list_table()
BEGIN

 with SET0 as( select 1 from dual union all select 1 from dual)
   , SET1 as ( select 1 from SET0 s1, SET0 s2)
   , SET2 as ( select 1 from SET1 s1, SET1 s2)
   , SET3 as ( select 1 from SET3 s1, SET3 s2)
   , SET4 as ( select 1 from SET4 s1, SET4 s2)
   , ControlSet AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1 from Dual)) rid  FROM SET4)

  select t_interval(Interval_Get_udf(TO_TIMESTAMP(startTime, 'dd/mm/yyyy') + rid/24 , 1))
  into intervalList
  from ControlSet;

  RETURN intervalList;

END fn_ExplodeIntervals;

person Ryan Fisch    schedule 19.07.2011    source источник
comment
Не могли бы вы добавить сообщение об ошибке в вопрос?   -  person Codo    schedule 19.07.2011


Ответы (2)


Вы, вероятно, можете упростить запрос в своей процедуре PL/SQL:

SELECT t_interval(Interval_Get_udf(TRUNC(startTime) + ROWNUM/24 , 1))
BULK COLLECT INTO intervalList
FROM dual 
CONNECT BY LEVEL <= 65536

Это могло бы избавиться от ошибки.

person Codo    schedule 19.07.2011
comment
правильно ли вставлен тип, я получаю сообщение об ошибке ORA-00932: несовместимые типы данных: ожидаемый T_INTERVAL получил T_INTERVAL_LIST_TABLE - person Ryan Fisch; 19.07.2011
comment
Пожалуйста, добавьте в свой вопрос полные определения типов и подпись функции Interval_Get_udf. Затем мы можем ответить кодом, который мы смогли протестировать первым. - person Codo; 19.07.2011
comment
Я сделал несколько тестов в системе Oracle и попытался угадать типы данных из вашего описания. Чего не хватало, так это BULK COLLECT и точки с запятой, упомянутой Джеффом Муром. Кроме того, я использовал TRUNC вместо TO_TIMESTAMP, так как вы, вероятно, хотите отрезать временную часть временной метки. - person Codo; 19.07.2011

Это трудно читать, так что я, вероятно, ошибаюсь...

Вы просто пропустили точку с запятой в конце следующего:
t_interval_list_table := t_interval_list_table();

person Jeff Moore    schedule 19.07.2011