【问题标题】:ORA-00979: not a GROUP BY expression error when case statement accesses a function from a packageORA-00979: 当 case 语句访问包中的函数时,不是 GROUP BY 表达式错误
【发布时间】:2015-06-23 13:00:36
【问题描述】:

尽管 cf_type 列是 group by 子句的精确副本,但我得到 ORA-00979 错误:

select case when a.accdef in (select column_value from 
                            table(accounts.get_corr_asset_accs)) 
                          then 'IN' else 'OUT' end cf_type
from a
group by case when a.accdef in 
         (select column_value 
          from table(accounts.get_corr_asset_accs)) then 'IN' else 'OUT'

         end;

但是在下面的例子中,当包没有被访问时,sql语句执行成功:

select case when a.accdef in (select 1 from dual) then 'IN' else 'OUT' end cf_type
from a
group by case when a.accdef in (select 1 from dual) then 'IN' else 'OUT' end;

为什么会出现错误(我知道我可以使用内联视图,但我对错误原因更感兴趣)?函数(accounts包的一部分)和嵌套表定义如下:

function get_corr_asset_accs return acc_numbers result_cache;

create type acc_numbers as table of number;

【问题讨论】:

  • @Sachu,您提供的编辑无效。 SQL 语句应为代码格式。

标签: sql oracle group-by


【解决方案1】:

尝试像这样包装它:

select cf_type from (
select case when a.accdef in (select column_value from 
                        table(accounts.get_corr_asset_accs)) 
                      then 'IN' else 'OUT' end cf_type
from a
) group by cf_type;

【讨论】:

  • 我知道解决方法,我很想知道为什么我会首先收到错误?
  • 这是因为它是不确定的,这意味着给定一个输入(在这种情况下什么都没有)它可以给出许多不同的输出。 Oracle 知道这一点并标记它。如果您认为函数是确定性的,请在函数 def 中的“IS”之前添加此标志,然后重试:DETERMINISTIC
  • 我确实将其标记为确定性,但我仍然收到错误。
  • 好的,这意味着该函数实际上不是确定性的,除非您在中间点捕获结果集,否则它将无法工作。这就是外部选择所做的。我希望这能回答你的问题?
  • 如果我明确地将其标记为确定性,它怎么会不是确定性的?也许,问题是我正在返回一个用户定义的类型。需要检查一下。
猜你喜欢
  • 2017-06-20
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多