我正在Oracle 19c中安装数据库模式,安装脚本已在Oracle 12中重复使用,没有问题。
我对 19c 的问题是,当它运行我们的视图脚本时,它会在某些视图上引发异常。我们看到的错误不是按表达式分组。
我们有一些观点,例如我们有这样的观点:
SELECT name, TRUNC(date) as Day
FROM sometable
GROUP BY name, TRUNC(date)
它将错误指向选择,就好像它没有看到该字段已经在按表达式分组中一样。
如前所述,这些查询在 Oracle 12 中运行良好多年,直到现在迁移到 19 时我们才看到问题。
这是 19c 中的错误还是需要应用某些内容?
19c,你说?无法重现。
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
您使用的表(这样您就不会说这是罪魁祸首)(显然,
date
是无效的列名;这是为date
数据类型保留的)。
SQL> create table sometable as
2 select 'Little' name, sysdate datum
3 from dual
4 connect by level <= 3;
Table created.
查询本身有效吗?是的:
SQL> select name, trunc(datum) as day
2 from sometable
3 group by name, trunc(datum);
NAME DAY
------ --------
Little 26.01.22
请注意 - 由于您没有聚合任何内容 - 您可以使用
DISTINCT
而不是 GROUP BY
:
SQL> select DISTINCT name, trunc(datum) as day
2 from sometable;
NAME DAY
------ --------
Little 26.01.22
我可以创建视图吗?是的:
SQL> create view v_sometable as
2 select name, trunc(datum) as day
3 from sometable
4 group by name, trunc(datum);
View created.
SQL>
正如我所说,我无法重现它。
请复制/粘贴您自己的 SQL*Plus 会话(就像我所做的那样),以便我们了解您所做的到底以及 Oracle 如何响应。
sqlext.fn_xx(日期1,日期2)返回XX;
v1 为( 选择 sqlext.fn_xx(coalesce(trunc(A.date1),trunc(A.date2)),trunc(A.date3)) 作为日期 从A 按 sqlext.fn_xx 分组(合并(trunc(A.date1),trunc(A.date2)),trunc(A.date3))
) 从 v1 v1 中选择 v1.day
然后我得到 ERR ORA-00979: not a group by expression