0

我能够在TSQL中获得类似的功能,但我是PL/SQL的相对新手,我希望有人能向我解释为什么会这样函数声明不会编译。
t_interval_list_table是具有varchar2(20)的单个属性的对象t_interval的表类型。 Interval_Get_udf只是返回类型为varchar(2)Oracle:从内联表函数返回CTE的结果集

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; 
+0

你介意在问题中添加错误信息吗? – Codo

回答

0

你或许可以在PL/SQL程序简化了查询的格式化字符串:

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

这可能摆脱错误的。

+0

是类型插入正确我得到一个错误ORA-00932:不一致的数据类型:预期T_INTERVAL得到T_INTERVAL_LIST_TABLE – tafaju

+0

请在您的问题中添加完整的类型定义和Interval_Get_udf函数的签名。然后我们可以用我们能够先测试的代码来回答。 – Codo

+0

我在Oracle系统上做了一些测试,并试图从描述中猜测数据类型。缺少的是“BULK COLLECT”和Jeff Moore提到的分号。此外,我已经使用了TRUNC而不是TO_TIMESTAMP,因为您可能想要截断时间戳的时间部分。 – Codo

0

它很难读这一个,所以我可能是错的...

你只是缺少在下面的结束分号:
t_interval_list_table:= t_interval_list_table();

+0

nah半结肠在那里。 – tafaju