【问题标题】:Oracle: return the result set from a CTE from a inline table functionOracle:从内联表函数的 CTE 返回结果集
【发布时间】:2011-07-19 13:09:10
【问题描述】:

我能够在 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;

【问题讨论】:

  • 您介意在问题中添加错误消息吗?

标签: plsql oracle10g common-table-expression user-defined-functions


【解决方案1】:

您可能可以在 PL/SQL 过程中简化查询:

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

这可能会消除错误。

【讨论】:

  • 类型插入是否正确我得到一个错误 ORA-00932:不一致的数据类型:预期的 T_INTERVAL 得到了 T_INTERVAL_LIST_TABLE
  • 请将完整的类型定义和 Interval_Get_udf 函数的签名添加到您的问题中。然后我们就可以用我们首先测试的代码来回答。
  • 我在Oracle系统上做了一些测试,并试图从你的描述中猜测数据类型。缺少的是“BULK COLLECT”和 Jeff Moore 提到的分号。此外,我使用 TRUNC 而不是 TO_TIMESTAMP,因为您可能想去掉时间戳的时间部分。
【解决方案2】:

很难读懂这个,所以我可能错了...

您是否只是缺少以下末尾的分号:
t_interval_list_table := t_interval_list_table();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2022-11-14
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多