1. 首页
  2. IT资讯

Oracle 数据库12c新特性总结(四)

【TechTarget中国原创】本文是Oracle数据库12c新特性的系列文章的第四篇,作者将重点介绍一些对开发者而言非常有用的新特性。相关阅读:Oracle 数据库12c新特性总结(一)、Oracle 数据库12c新特性总结(二)、Oracle 数据库12c新特性总结(三)

第四部分包括:

  • 如何在子表包含数据的情况下截断一个主表
  • 限制Top-N查询结果的记录
  • SQL*Plus的各种增强
  • 会话级序列
  • WITH语句的改善
  • 扩展数据类型

截断表CASCADE

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

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

SQL>TRUNCATETABLECASCADE; SQL>TRUNCATETABLEPARTITIONCASCADE;

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

对Top-N查询结果限制记录

在之前的版本中有多种间接手段来对顶部或底部记录获取Top-N查询结果。而在12c中,通过新的FETCH FIRST|NEXT|PERCENT语句简化了这一过程并使其变得更为直接。为了从EMP表检索排名前10的工资记录,可以用以下新的SQL语句:

SQL>SELECTeno,ename,salFROMempORDERBYSALDESC FETCHFIRST10ROWSONLY;

以下示例获取排名前N的所有相似的记录。例如,如果第十行的工资值是5000,并且还有其他员工的工资符合排名前N的标准,那么它们也同样会由WITH TIES语句获取。

SQL>SELECTeno,ename,salFROMempORDERBYSALDESC FETCHFIRST10ROWSONLYWITHTIES;

以下示例限制从EMP表中获取排名前10%的记录:

SQL>SELECTeno,ename,salFROMempORDERBYSALDESC FETCHFIRST10PERCENTROWSONLY;

以下示例忽略前5条记录并会显示表的下5条记录:

SQL>SELECTeno,ename,salFROMempORDERBYSALDESC OFFSET5ROWSFETCHNEXT5ROWSONLY;

所有这些限制同样可以很好的应用于PL/SQL块。

BEGIN SELECTsalBULKCOLLECTINTOsal_vFROMEMP FETCHFIRST100ROWSONLY; END;

对SQL*Plus的各种增强

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

SQL>CREATEPROCEDUREmp1 res1sys_refcursor; BEGIN openres1forSELECTeno,ename,salFROMemp; dbms_sql.return_result(res1); END; SQL>executemp1;

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

显示不可见字段:在本系列文章的第一部分,我已经对不可见字段的新特性做了相关阐述。当字段定义为不可见时,在描述表结构时它们将不会显示。然而,你可以通过在SQL*Plus提示符下进行以下设置来显示不可见字段的相关信息:

SQL>SETCOLINVISIBLEON|OFF

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

会话级序列

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

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

SQL>CREATESEQUENCEmy_seqSTARTWITH1INCREMENTBY1SESSION; SQL>ALTERSEQUENCEmy_seqGLOBAL|SESSION;

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

WITH语句的改善

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

WITH PROCEDURE|FUNCTIONtest1(…) BEGIN END; SELECTFROMtable_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。

原文链接:http://www.searchdatabase.com.cn/showcontent_75994.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29578568/viewspace-2147308/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:布吉卡,转转请注明出处:http://www.cxybcw.com/195029.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code