oracle 11.2.0.1版本sql执行报ora-00979:不是group by表达式错误解决

本文档详细记录了在Oracle 11.2.0.1版本中遇到的ORA-00979错误,该错误出现在含有关联查询、GROUP BY和ORDER BY的SQL语句中。经过在不同版本的测试,确认可能是数据库版本bug。在MOS上找到了相关bug信息和解决方案,包括修改特定的隐藏参数。最终通过设置_complex_view_merging=false解决了问题。

                                                         尽量宽恕别人,而绝不要原谅自己-西拉斯(古罗马)

 

    oracle 11.2.0.1版本中,sql语句中存在关联查询并结果中存在group by和order by条件时,执行将报ora-00979错误。经本人反复查看语句,确认语句没写错,并在11.2.0.4版本中执行语句,发现未报错。由此怀疑应该是版本bug问题。后经MOS查看,确认了bug。

 

1,基本报错

    在本地11.2.0.1版本中执行语句,报错(为保密,特意抹去了表名):

    

2,高版本测试

    在11.2.0.4版本中测试,发现该语句可以正常执行:

3,错误定位

    同一语句,在11.2.0.1版本中执行报错,在11.2.0.4版本中正常运行,该问题极大可能为数据库bug,经查mos,确实查到相关bug信息及解决版本:

    链接如下:https://support.oracle.com/epmos/faces/SearchDocDisplay?_afrLoop=340018918702965&_afrWindowMode=0&_adf.ctrl-state=skeblo6ia_4

ORA-979 bugs on 11.2.0.1 (Doc ID 1085766.1)

APPLIES TO:
Oracle Database - Enterprise Edition - Version 11.2.0.1.0 to 11.2.0.1.0 [Release 11.2]
Oracle Database Exadata Cloud Machine - Version N/A and later
Oracle Cloud Infrastructure - Database Service - Version N/A and later
Oracle Database Cloud Exadata Service - Version N/A and later
Oracle Database Exadata Express Cloud Service - Version N/A and later
Information in this document applies to any platform.
***Checked for relevance on 07-Aug-2017***

PURPOSE
The purpose of this document is to have a complete list of ORA-979 bugs with workarounds and their current status on 11.2

QUESTIONS AND ANSWERS
1. BUG 9411496 - ORA-979 ON 'UNION ALL PUSHED PREDICATE' (Query Optimizer bug)
--- Symptoms ---
When the query has group by and order by, and they use the same attribute and the cursor_sharing is set to a value <> EXACT, the queries fail with ORA-979.

The call stack from the event 979 errorstack is:

... qcuErroer qcuErroep erroep qecgoc qecoby qecpqbcheck qecdrv kkqcttcalo kkqctdrvJPPD kkqjpdctr qksqbApplyToQbc kkqctdrvTD kkqjpddrv kkqdrv kkqctdrvIT apadrv opitca kksFullTypeCheck rpiswu2 kksSetBindType kksfbc ...

--- Changes ---
Following the upgrade to 11.2.

--- Cause ---
Bug 9411496 - ORA-979 ON 'UNION ALL PUSHED PREDICATE'

--- Solution ---
The workarounds are:

1. "_fix_control"="5520732:OFF"

OR 

2. optimizer_features_enable = '11.1.0.7'

OR 

3."_optimizer_push_pred_cost_based" = false

OR

4."_optimizer_cost_based_transformation" = off

The bug is fixed and there are patches for some platforms.  If the workarounds are not acceptable, a one-off patch for the bug should be requested from Oracle Support.

2. Bug 9478304 "LOOP FAILING WITH ORA-00979 NOT A GROUP BY EXPRESSION" (Query Optimizer bug)
--- Symptoms ---

GROUP BY/ORDER BY in PL/SQL cursor loops fails with ORA-979.

The testcase is:

CREATE TABLE testing (AAA NUMBER, BBB NUMBER)
/
DECLARE
CURSOR curTesting(ciPPGroupID IN NUMBER) IS
SELECT DECODE(ciPPGroupID, AAA, 'PP', 'PP_GROUP') AS prisa_type,
COUNT(DISTINCT BBB) AS nof
FROM testing
GROUP BY DECODE(ciPPGroupID, AAA, 'PP', 'PP_GROUP')
ORDER BY prisa_type DESC;
.
BEGIN
FOR row IN curTesting(0) LOOP
NULL;
END LOOP;
END;
/
.
insert into testing values(1,2);
insert into testing values(1,2);
.
DECLARE
CURSOR curTesting(ciPPGroupID IN NUMBER) IS
SELECT DECODE(ciPPGroupID, AAA, 'PP', 'PP_GROUP') AS prisa_type,
COUNT(DISTINCT BBB) AS nof
FROM testing
GROUP BY DECODE(ciPPGroupID, AAA, 'PP', 'PP_GROUP')
ORDER BY prisa_type DESC;
.
BEGIN
FOR row IN curTesting(0) LOOP
NULL;
END LOOP;
END;
/
.
ERROR at line 1:
ORA-979: not a GROUP BY expression
ORA-6512: at line 3
ORA-6512: at line 10

The call stack from the event 979 errorstack is:

... qcuErroer qcuErroep erroep qecgoc qecoby qecpqbcheck qecdrv kkqcttcalo kkqctdrvIT apadrv opitca
kksFullTypeCheck rpiswu2 kksSetBindType kksfbc opiexe opipls opiodr PGOSF141_rpidrus skgmstack rpiswu2 rpidrv psddr0 psdnal pevm_EXECC pfrinstr_EXECC pfrrun_no_tool pfrrun plsql_run peicnt kkxexe ...

--- Changes ---
Following the upgrade to 11.2.

--- Cause ---
Bug 9478304 "LOOP FAILING WITH ORA-00979 NOT A GROUP BY EXPRESSION"

--- Solution ---
The workarounds are:

1. optimizer_features_enable='11.1.0.7'

OR

2. optimizer_features_enable='10.2.0.4'

OR

3. _optimizer_distinct_agg_transform = false;

The bug is still being worked by development and a fix has not been provided yet.

3. Bug 9004697 "ORA-979 or ORA-937 in query with a correlated set subquery containing aggregates" (Query Optimizer bug)
--- Symptoms ---
ORA-979 or ORA-937 in query with a correlated set subquery containing aggregates.

select empno from scott.emp d where d.deptno =10 and 
exists ( -- Subquery
select count(1) from scott.dept b where d.deptno= b.deptno -- Correlated
UNION -- The SET operand
select count(1) from scott.dept c where d.deptno = c.deptno -- Correlated
)


The call stack from the event 979 errorstack is:

...qcuErroer qcuErroep erroep qecgoc qechav qechav qechav qecpqbcheck qecdrv
qecdrv qecdrv qecdrv kkqcttcalo kkqctdrvSU kkqutruns kkqudrv kkqctdrvTD
kkqdrv kkqctdrvIT apadrv opitca kksLoadChild kxsGetRuntimeLock kksfbc 
kkspsc0 kksParseCursor...

--- Changes ---
Following the upgrade to 11.2.

--- Cause ---
Unpublished Bug 9004697 - "ORA-979 or ORA-937 in query with a correlated set subquery containing aggregates"

--- Solution ---
The workaround is:

 _optimizer_unnest_corr_set_subq=false

The bug is fixed and there are patches for some platforms. If the workarounds are not acceptable and there is no patch for a particular environment, the patch should be requested from Oracle Support.

4. Bug 9071471 "STAS ORA-979 WHILE RUNNING SELECT SUBSTRB(COL).... GROUP BY COL" (RDBMS bug)
--- Symptoms ---
ORA-979 if select list contains an expression and group by is on base column of expression. 

The call stack from the event 979 errorstack is:

... qcuErroer <- qcuErroep <- erroep <- qecgoc <- qecsel <- qecpqbcheck
<- qecdrv <- kkqcttcalo <- kkqctInterleaveCVM <- kkqctdrvSU <- kkqutruns
<- kkqudrv <- kkqctdrvTD <- kkqdrv <- kkqctdrvIT <- apadrv
<- opitca <- kksFullTypeCheck <- rpiswu2 <- kksLoadChild <- kxsGetRuntimeLock
<- kksfbc <- kkspsc0 ...

--- Changes ---
Following the upgrade to 11.2.

--- Cause ---
Unpublished Bug 9071471 "STAS ORA-979 WHILE RUNNING SELECT SUBSTRB(COL).... GROUP BY COL"

--- Solution ---
The workaround is:

_replace_virtual_columns = false 

The bug is fixed and there are patches for some platforms. If the workarounds are not acceptable and there is no patch for a particular environment, the patch should be requested from Oracle Support.

5. Bug 9800061 "ORA-00979: NOT A GROUP BY EXPRESSION" (Query Optimizer bug)
--- Symptoms ---
ORA-979 when the query contains ORDER BY expression.

The call stack from the event 979 errorstack is:

... qcuErroep <- erroep <- qecgoc <- qecoby <- qecpqbcheck <- qecdrv <- kkqcttcalo
<- kkqctInterleaveCVM <- kkqctdrvSU <- kkqutruns <- kkqudrv 
<- kkqctdrvTD <- kkqdrv <- kkqctdrvIT <- apadrv <- opitca
<- kksFullTypeCheck <- rpiswu2 <- kksLoadChild <- kxsGetRuntimeLock 
<- kksfbc <- kkspsc0 <- kksParseCursor ...

The testcase is:

create table t1 ( NR_RELA number, CD_ROL varchar2(2));
create table t2(NR_CLNT number);
create table t3(NR_CLNT number,DAT_STRT date);

alter session set "_complex_view_merging"=TRUE;
select 1 from
t1 rol,t2 clv
where
DECODE(rol.cd_rol, 'VN',1,2) = ( SELECT MIN(DECODE(cd_rol, 'VN',1,2))
from t1 where nr_rela = rol.nr_rela)
order by decode( ( select max(dat_strt) from t3 cvn
where cvn.nr_clnt = clv.nr_clnt), NULL, 2, 1);

--- Changes ---
Following the upgrade to 11.2.

--- Cause ---
Bug 9800061 "ORA-00979: NOT A GROUP BY EXPRESSION"

--- Solution ---
The workarounds are:

_complex_view_merging=false

OR

_optimizer_cost_based_transformation=off

OR 

optimizer_features_enable='10.2.0.4'

OR

optimizer_features_enable='11.1.0.7'


The bug is fixed in version 12.1. If the workarounds are not acceptable, the patch should be requested from Oracle Support.

4,问题解决

    MOS中已经给出了造成该错误的不同情况的解决方案,我是通过修改隐藏参数_complex_view_merging=false解决该问题,大家可以根据自己本人情况进行调整解决。

<think>好的,我现在需要解决用户遇到的Oracle数据库错误ORA-00979,也就是“不是GROUP BY表达式”的问题。首先,我得回忆一下这个错误的常见原因和解决方法。根据用户提供的引用内容,特别是引用[2]和[3],这个错误通常和GROUP BY子句的使用有关。用户可能在SELECT列表中包含了不在GROUP BY子句中的列,或者没有使用聚合函数。 首先,我应该解释这个错误的基本原因。根据引用[2]和[3],当SELECT中的字段没有出现在GROUP BY子句中,或者没有使用聚合函数时,Oracle会抛出这个错误。例如,如果用户写了类似SELECT a, b FROM table GROUP BY a,这时候b不在GROUP BY中,也没有用聚合函数,就会出错。 接下来,我需要列举解决方案。常见的解决方法包括修改SELECT列表,确保所有非聚合字段都在GROUP BY中,或者为这些字段添加聚合函数。另外,用户可能需要检查是否有拼写错误或别名问题,比如在GROUP BY中使用了字段别名,而Oracle不支持这种写法。引用[3]提到在数据库中执行没问题但在IDE中错,可能和不同环境下的SQL解析有关,所以检查环境设置也是一个可能的点。 然后,用户提到了使用Oracle JDBC时的问题,可能需要特别处理。引用[4]提到在PIVOT/UNPIVOT操作中不支持绑定变量,但这里的问题可能不同。不过,当使用JDBC时,确保动态生成的SQL符合GROUP BY规则很重要,可能需要检查代码中SQL拼接是否正确,特别是在GROUP BY部分是否遗漏了字段。 此外,用户可能需要了解Oracle和其他数据库(如MySQL)在GROUP BY处理上的差异。比如,MySQL在某些模式下允许SELECT非聚合字段而不在GROUP BY中,但Oracle严格不允许,这可能导致迁移时出现问题。提醒用户注意这一点可能会有帮助。 最后,应该提供示例代码,说明正确的写法,比如在GROUP BY中包含所有非聚合字段,或者使用聚合函数如MAX(b)。同时,建议用户检查SQL语句的结构,使用工具格式化SQL以便发现错误,以及查阅官方文档确认语法规则。 总结步骤:解释错误原因→列举解决方法→提供示例→注意事项→检查环境→参考官方文档。需要确保回答结构清晰,分点说明,并引用提供的资料来支持解决方案。</think>### ORA-00979 "不是 GROUP BY 表达式" 解决方案 #### 错误原因 ORA-00979 错误表明在包含 `GROUP BY` 子句的 SQL 语句中,`SELECT` 列表中的列既未出现在 `GROUP BY` 子句中,也未使用聚合函数(如 `MAX`、`SUM` 等)[^2][^3]。Oracle 要求所有非聚合列必须明确包含在 `GROUP BY` 子句中,这与某些其他数据库(如 MySQL)的宽松模式不同。 --- #### 解决方案步骤 1. **检查 SELECT 与 GROUP BY 的匹配性** - **错误示例**: ```sql SELECT department_id, employee_name, SUM(salary) FROM employees GROUP BY department_id; -- employee_name 未出现在 GROUP BY 中 ``` - **修复方法**: - 将 `employee_name` 添加到 `GROUP BY`: ```sql SELECT department_id, employee_name, SUM(salary) FROM employees GROUP BY department_id, employee_name; ``` - 或对 `employee_name` 使用聚合函数: ```sql SELECT department_id, MAX(employee_name), SUM(salary) FROM employees GROUP BY department_id; ``` 2. **避免字段别名问题** - Oracle 不允许在 `GROUP BY` 中使用 `SELECT` 列表中的别名[^2]: ```sql SELECT department_id AS dept, SUM(salary) FROM employees GROUP BY dept; -- 错误!需使用原始列名 ``` **正确写法**: ```sql SELECT department_id AS dept, SUM(salary) FROM employees GROUP BY department_id; ``` 3. **检查复杂表达式的一致性** - 若 `SELECT` 中包含函数或计算字段,需在 `GROUP BY` 中重复相同表达式: ```sql SELECT TO_CHAR(hire_date, 'YYYY'), AVG(salary) FROM employees GROUP BY TO_CHAR(hire_date, 'YYYY'); -- 不可简化为 GROUP BY hire_date ``` 4. **JDBC 或程序中的动态 SQL 处理** - 在 Java 等编程中拼接 SQL 时,需确保动态生成的 `GROUP BY` 子句包含所有必要字段[^4]: ```java String sql = "SELECT department_id, COUNT(*) FROM employees GROUP BY " + groupByColumns; // 需验证 groupByColumns 是否包含 SELECT 中的非聚合字段 ``` 5. **区分 Oracle 与其他数据库行为** - 若从 MySQL 迁移到 Oracle,需调整原有 SQL:MySQL 可能允许 `SELECT` 非聚合字段而不在 `GROUP BY` 中,但 Oracle 严格禁止。 --- #### 示例场景 **错误 SQL**: ```sql SELECT region, product_type, SUM(sales) FROM sales_data GROUP BY region; -- product_type 未分组或聚合 ``` **修正方法**: - 方案1:添加 `product_type` 到 `GROUP BY` ```sql SELECT region, product_type, SUM(sales) FROM sales_data GROUP BY region, product_type; ``` - 方案2:对 `product_type` 使用聚合函数 ```sql SELECT region, MAX(product_type), SUM(sales) FROM sales_data GROUP BY region; ``` --- #### 注意事项 - 使用 SQL 格式化工具(如 Oracle SQL Developer)检查语句结构。 - 查询 `DBA_TAB_COLUMNS` 确认字段名拼写无误。 - 若在 IDE 中错但数据库执行正常,检查 IDE 的 SQL 解析设置或驱动版本--- #### 引用资料 - Oracle 官方文档建议所有非聚合列必须包含在 `GROUP BY` 中[^2]。 - 动态 SQL 拼接需特别注意语法完整性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TPCloud

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值