zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    linux 配置Apache 、PHP
    SQL Server DML(SELECT)常见用法(二)
    SQL Server DML(UPDATE、INSERT、DELETE)常见用法(一)
    PropertyGrid—添加EventTab
    PropertyGrid—添加属性Tab
    PropertyGrid—默认属性,默认事件,属性默认值
    PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框
    PropertyGrid--为复杂属性提供编辑功能
    PropertyGrid--基本功能
    Intellij IDEA使用(一)项目模板类型
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4758447.html
Copyright © 2011-2022 走看看