ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

12C SQL方面新特性小结

2021-04-09 16:54:38  阅读:214  来源: 互联网

标签:语句 12c SQL CASCADE 12C DDL 小结 会话级


相同字段上的多重索引  

    在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有