如何从其字段未命名的临时表中选择最大值

时间:2017-10-19 16:46:52

标签: oracle plsql

我正在编写一个PL / SQL函数,需要从几个不同的表中获取日期并返回最新的表。我的方法是:

  • 创建一个临时表来保存日期:

    CREATE TYPE t_dates IS TABLE OF DATE; /

  • 创建一些局部变量:

    l_date DATE; l_dates t_dates := t_dates(); l_idx INTEGER := 0; l_output_date DATE;

  • 然后在我感兴趣的每个日期选择一个变量,并将其添加到临时表中:

    SELECT it.date INTO l_date FROM interesting_table it WHERE it.id = 1 ;

    l_dates.extend; l_idx := l_idx + 1; l_dates(l_idx) := l_date;

  • 填充临时表后,现在我只想从中选择最大值。我怎么做?有点像...

    SELECT max(*) INTO l_output_date FROM l_dates ;

    RETURN l_output_date;

但我不确定我可以像这样引用我的临时表,也不知道如何找到未命名的列的最大值。

编辑:当我测试上述内容时,出现错误:PL/SQL: ORA-00936: missing expression与我所拥有的行SELECT max(*)相关。但是,我不相信这是我唯一的错误,因为如果我将最后一个块更改为:

SELECT *
  INTO l_output_date
  FROM l_dates
 WHERE rownum = 1
;

,仅用于测试,应该选择临时表中的第一个日期,然后错误变为PL/SQL: ORA-00942: table or view does not exist,这表明我不能以这种方式引用我的临时表。

我从评论中了解到我应该max(column_value)而不是max(*),但是使用它,我仍然会收到table or view does not exist错误。

1 个答案:

答案 0 :(得分:0)

无法从您尝试过的嵌套表中进行选择。 您可能必须使用逻辑来查找最大值

l_idx := l_idx + 1;
l_dates(l_idx) := l_date;
if(l_date > l_dates(l_idx-1) OR l_idx =1) THEN 
   max_date :=l_date;
End if;

对于您的情况,您可以在查询中找到最大日期,而不是获取日期列表然后获取最大日期

SELECT max(it.date)
  INTO l_date
  FROM interesting_table it
 WHERE it.id = 1
;