数据库
首页 > 数据库> > 12C SQL方面新特性小结

12C SQL方面新特性小结

作者:互联网

相同字段上的多重索引  

    在Oracle 12c R1之前,一个字段是无法以任何形式拥有多个索引的。或许有人会想知道为什么通常一个字段需要有多重索引,事实上需要多重索引的字段或字段集合是很多的。在12c R1中,只要索引类型的形式不同,一个字段就可以包含在一个B-tree索引中,同样也可以包含在Bitmap索引中。注意,只有一种类型的索引是在给定时间可用的。
翻页查询

    之前版本中需要借用ROWNUM对查询结果设置“标号”实现分页查询

    wps28D8.tmp

    12c中引入OFFSET 和 FETCH 实现快捷分页方式

wps28F9.tmp

不可见字段  

    在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件。

    在12c R1中,你可以在表中创建不可见字段。当一个字段定义为不可见时,这一字段就不会出现在通用查询中,除非在SQL语句或条件中有显式的提及这一字段,或是在表定义中有DESCRIBED。要添加或是修改一个不可见字段是非常容易的,反之亦然。

    当字段定义为不可见时,在描述表结构时它们将不会显示。然而,你可以通过在SQL*Plus提示符下进行以下设置来显示不可见字段的相关信息:

    SQL> SET COLINVISIBLE ON|OFF;

    以上设置仅对DESCRIBE 命令有效。目前它还无法对不可见字段上的SELECT 语句结果产生效果。

    wps2919.tmp

    wps2939.tmp

    wps2959.tmp

    wps296A.tmp

DDL日志  

    在之前的版本中没有可选方法来对DDL操作进行日志记录。而在12c R1中,你现在可以将DDL操作写入xml和日志文件中。这对于了解谁在什么时间执行了create或drop命令是十分有用的。要开启这一功能必须对ENABLE_DDL_LOGGING 初始参数加以配置。这一参数可以在数据库或会话级加以设置。当此参数为启用状态,所有的DDL命令会记录在$ORACLE_BASE/diag/rdbms/DBNAME/log|ddl 路径下的xml和日志文件中。一个xml中包含DDL命令,IP地址,时间戳等信息。这可以帮助确定在什么时候对用户或表进行了删除亦或是一条DDL语句在何时触发。

    开启DDL日志功能

    SQL> ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;

    以下的DDL语句可能会记录在xml或日志文件中:

    CREATE|ALTER|DROP|TRUNCATE TABLE

    DROP USER

    CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENCE

截断表CASCADE  

    在之前的版本中,在子表引用一个主表以及子表存在记录的情况下,是不提供截断此主表操作的。而在12c中的带有CASCADE操作的TRUNCATE TABLE可以截断主表中的记录,并自动对子表进行递归截断,并作为DELETE ON CASCADE服从外键引用。由于这是应用到所有子表的,所以对递归层级的数量是没有CAP的,可以是孙子表或是重孙子表等等。

    这一增强摈弃了要在截断一个主表之前先截断所有子表记录的前提。新的CASCADE语句同样也可以应用到表分区和子表分区等。

    SQL> TRUNCATE TABLE CASCADE; 
    SQL> TRUNCATE TABLE PARTITION CASCADE;

    如果对于子表的外键没有定义ON DELETE CASCADE 选项,便会抛出一个ORA-14705错误

对SQL*Plus的各种增强  

    SQL*Plus的隐式结果:12c中,在没有实际绑定某个RefCursor的情况下,SQL*Plus从一个PL/SQL块的一个隐式游标返回结果。这一新的dbms_sql.return_result过程将会对PL/SQL 块中由SELECT 语句查询所指定的结果加以返回并进行格式化。以下代码对此用法进行了描述:

    SQL> CREATE PROCEDURE mp1 
            res1 sys_refcursor; 
                BEGIN 
                    open res1 for SELECT eno,ename,sal FROM emp; 
                    dbms_sql.return_result(res1); 
            END; 
    SQL> execute mp1;

    当此过程得以执行,会在SQL*Plus上返回格式化的记录。

会话级序列  

    在12c中现在可以创建新的会话级数据库序列来支持会话级序列值。这些序列的类型在有会话级的全局临时表上最为适用。

    会话级序列会产生一个独特范围的值,这些值是限制在此会话内的,而非超越此会话。一旦会话终止,会话序列的状态也会消失。以下示例解释了创建一个会话级序列:

    SQL> CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1 SESSION; 
    SQL> ALTER SEQUENCE my_seq GLOBAL|SESSION;

    对于会话级序列,CACHE, NOCACHE, ORDER 或 NOORDER 语句会予以忽略。

WITH语句的改善  

    在12c中,你可以用SQL更快的运行PL/SQL函数或过程,这些是由SQL语句的WITH语句加以定义和声明的。以下示例演示了如何在WITH语句中定义和声明一个过程或函数:

    WITH 
    PROCEDURE|FUNCTION test1 (…) 
    BEGIN 
    END; 
    SELECT FROM table_name; 
    /

    尽管你不能在PL/SQL单元直接使用WITH语句,但其可以在PL/SQL单元中通过一个动态SQL加以引用。

扩展数据类型  

    在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的大小会从4K以及2K字节扩展至32K字节。只要可能,扩展字符的大小会降低对LOB数据类型的使用。为了启用扩展字符大小,你必须将MAX_STRING_SIZE的初始数据库参数设置为EXTENDED。

要使用扩展字符类型需要执行以下过程:

    1. 关闭数据库

    2. 以升级模式重启数据库

    3. 更改参数: ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED;

    4. 执行 utl32k.sql as sysdba : SQL> @?/rdbms/admin/utl32k.sql

    5. 关闭数据库

    6. 以读写模式重启数据库

    对比LOB数据类型,在ASSM表空间管理中,扩展数据类型的字段以SecureFiles LOB加以存储,而在非ASSM表空间管理中,它们则是以BasciFiles LOB进行存储的。

    注意:一旦更改,你就不能再将设置改回STANDARD。

标签:语句,12c,SQL,CASCADE,12C,DDL,小结,会话级
来源: https://blog.51cto.com/lhrbest/2694858