Oracle: вернуть набор результатов из CTE из встроенной табличной функции - PullRequest
0 голосов
/ 19 июля 2011

Я могу заставить подобную функцию работать в 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;

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

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

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

0 голосов
/ 19 июля 2011

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

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

Это может избавить от ошибки.

...