12C SQL方面新特性小結

kingsql發表於2014-11-12
相同欄位上的多重索引

    在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。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3090/viewspace-1337202/,如需轉載,請註明出處,否則將追究法律責任。

相關文章