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