ORA-01791: not a SELECTed expression 一种是不 bug 的 bug!

[ora11@lixora ~]$ !sql
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 27 09:50:54 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select distinct sal, empno from scott.emp order by deptno;

       SAL      EMPNO
---------- ----------
      2450       7782
      5000       7839
      1300       7934
      2975       7566
      3000       7902
      1100       7876
       800       7369
      3000       7788
      1250       7521
      1500       7844
      1600       7499

       SAL      EMPNO
---------- ----------
       950       7900
      2850       7698
      1250       7654

14 rows selected.


------把 empno 换成 ename
SQL> select distinct sal,ename from scott.emp order by deptno;
select distinct sal,ename from scott.emp order by deptno
                                                  *
ERROR at line 1:
ORA-01791: not a SELECTed expression

-----把,ename,empno 都加到select 中:
SQL> select distinct sal,ename,empno from scott.emp order by deptno;

       SAL ENAME                     EMPNO
---------- -------------------- ----------
      2450 CLARK                      7782
      5000 KING                       7839
      1300 MILLER                     7934
      2975 JONES                      7566
      3000 FORD                       7902
      1100 ADAMS                      7876
       800 SMITH                      7369
      3000 SCOTT                      7788
      1250 WARD                       7521
      1500 TURNER                     7844
      1600 ALLEN                      7499

       SAL ENAME                     EMPNO
---------- -------------------- ----------
       950 JAMES                      7900
      2850 BLAKE                      7698
      1250 MARTIN                     7654

14 rows selected.

SQL> select distinct sal,empno,sal from scott.emp order by deptno;

       SAL      EMPNO        SAL
---------- ---------- ----------
      2450       7782       2450
      5000       7839       5000
      1300       7934       1300
      2975       7566       2975
      3000       7902       3000
      1100       7876       1100
       800       7369        800
      3000       7788       3000
      1250       7521       1250
      1500       7844       1500
      1600       7499       1600

       SAL      EMPNO        SAL
---------- ---------- ----------
       950       7900        950
      2850       7698       2850
      1250       7654       1250

14 rows selected.

这里为啥 empno 换成ename 后就无法运行了呢?
在做下下面測试:

---去掉empno 列上的主键

SQL> select distinct sal, empno from scott.t_emp order by deptno;
select distinct sal, empno from scott.t_emp order by deptno
                                                     *
ERROR at line 1:
ORA-01791: not a SELECTed expression

---加入empno 列上的主键
SQL> alter table t_emp add constraint pk_t_emp primary key(empno) ;

Table altered.

SQL> desc t_emp
 Name                                                                                Null?    Type
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 EMPNO                                                                               NOT NULL NUMBER(4)
 ENAME                                                                                        VARCHAR2(10)
 JOB                                                                                          VARCHAR2(9)
 MGR                                                                                          NUMBER(4)
 HIREDATE                                                                                     DATE
 SAL                                                                                          NUMBER(7,2)
 COMM                                                                                         NUMBER(7,2)
 DEPTNO                                                                                       NUMBER(2)

SQL> select distinct sal, empno from scott.t_emp order by deptno;

       SAL      EMPNO
---------- ----------
      2450       7782
      5000       7839
      1300       7934
      2975       7566
      3000       7902
      1100       7876
       800       7369
      3000       7788
      1250       7521
      1500       7844
      1600       7499
       950       7900
      2850       7698
      1250       7654

14 rows selected.

问题总结:

至于为什么会有这个不是bug 的bug 存在,事实上是开发给挖的坑,然后让 dba 往里跳:
 
FYI:
ORA-01791: not a SELECTed expression after upgrade to 11.2.0.4 (Doc ID 1600974.1)
http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10002.htm#SQLRF20039

##########################################################
Restrictions on the ORDER BY Clause The following restrictions apply to the ORDER BY clause:

•If you have specified the DISTINCT operator in this statement, then this clause cannot refer to columns unless they appear in the select list.

•An order_by_clause can contain no more than 255 expressions.

•You cannot order by a LOB, LONG, or LONG RAW column, nested table, or varray.

•If you specify a group_by_clause in the same statement, then this order_by_clause is restricted to the following expressions:

◦Constants

◦Aggregate functions

◦Analytic functions

◦The functions USER, UID, and SYSDATE

◦Expressions identical to those in the group_by_clause

◦Expressions comprising the preceding expressions that evaluate to the same value for all rows in a group
##################################################################


 
 
ORA-01791: not a SELECTed expression after upgrade to 11.2.0.4 (Doc ID 1600974.1)  To Bottom
 
________________________________________
 
In this Document
 Symptoms

 Changes

 Cause

 Solution

 References

________________________________________

APPLIES TO:
Oracle Database - Enterprise Edition - Version 11.2.0.4 and later
Information in this document applies to any platform.


SYMPTOMS
a select DISTINCT query and the order by column does not reference a select list item after upgrade to 11.2.0.4
SQL> select distinct sal, empno from scott.emp order by deptno;
select distinct sal, empno from scott.emp order by deptno
                                                   *
ERROR at line 1:
ORA-01791: not a SELECTed expression
But it was working on previous release ..
SQL> select distinct sal, empno from scott.emp order by deptno;

       SAL      EMPNO
---------- ----------
      2450       7782
      5000       7839
 
CHANGES
 upgrade to 11.2.0.4


CAUSE
 The issue have been investigated in the following bug:
Bug:17655864 - ORA-01791: NOT A SELECTED EXPRESSION AFTER 11.2.0.4 PATCH
which is closed as not a bug. and this is expected behvior .
so the correct behavior is on 11.2.0.4 and not older versions.
This is due to
BUG 13768663 - SELECT WORKS IN 10.2 AND 11.2.0.3 FAILS 11.1.0.7 ORA-01791
Invalid query which should raise ORA-1791 is working fine without any error starting from 11.2.0.1.This is fixed in 11.2.0.4 and hence you may get the error ORA-1791 in 11.2.0.4.


SOLUTION
The expected behaviour for this statement is that it should report ORA-01791 That is, this is a select DISTINCT query and the order by column does not reference a select list item. This is a documented restriction of the order by clause.
http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10002.htm#SQLRF20039
 
This behaviour is corrected through bugfix 13768663.

so please add the orderby column in the select statement
SQL> select distinct sal, empno, deptno from scott.emp order by deptno;

       SAL      EMPNO     DEPTNO
---------- ---------- ----------
      2450       7782         10
      5000       7839         10
      1300       7934         10


REFERENCES
BUG:17655864 - ORA-01791: NOT A SELECTED EXPRESSION AFTER 11.2.0.4 PATCH
NOTE:13768663.8 - Bug 13768663 - ORA-1791 not reported in 11.2 when expected
BUG:13768663 - SELECT WORKS IN 10.2 AND 11.2.0.3 FAILS 11.1.0.7 ORA-01791

版权声明:本文博主原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/blfshiye/p/4758447.html