您好,登錄后才能下訂單哦!
【TechTarget中國原創(chuàng)】本文是Oracle數(shù)據(jù)庫12c新特性的系列文章的第四篇,作者將重點(diǎn)介紹一些對開發(fā)者而言非常有用的新特性。相關(guān)閱讀:Oracle 數(shù)據(jù)庫12c新特性總結(jié)(一)、Oracle 數(shù)據(jù)庫12c新特性總結(jié)(二)、Oracle 數(shù)據(jù)庫12c新特性總結(jié)(三)
第四部分包括:
截?cái)啾鞢ASCADE
在之前的版本中,在子表引用一個(gè)主表以及子表存在記錄的情況下,是不提供截?cái)啻酥鞅聿僮鞯?。而?2c中的帶有CASCADE操作的TRUNCATE TABLE可以截?cái)嘀鞅碇械挠涗洠⒆詣?dòng)對子表進(jìn)行遞歸截?cái)?,并作?strong>DELETE ON CASCADE服從外鍵引用。由于這是應(yīng)用到所有子表的,所以對遞歸層級的數(shù)量是沒有CAP的,可以是孫子表或是重孫子表等等。
這一增強(qiáng)擯棄了要在截?cái)嘁粋€(gè)主表之前先截?cái)嗨凶颖碛涗浀那疤?。新?strong>CASCADE語句同樣也可以應(yīng)用到表分區(qū)和子表分區(qū)等。
SQL> TRUNCATE TABLE CASCADE; SQL> TRUNCATE TABLE PARTITION CASCADE; |
如果對于子表的外鍵沒有定義ON DELETE CASCADE 選項(xiàng),便會拋出一個(gè)ORA-14705錯(cuò)誤。
對Top-N查詢結(jié)果限制記錄
在之前的版本中有多種間接手段來對頂部或底部記錄獲取Top-N查詢結(jié)果。而在12c中,通過新的FETCH FIRST|NEXT|PERCENT語句簡化了這一過程并使其變得更為直接。為了從EMP表檢索排名前10的工資記錄,可以用以下新的SQL語句:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC FETCH FIRST 10 ROWS ONLY; |
以下示例獲取排名前N的所有相似的記錄。例如,如果第十行的工資值是5000,并且還有其他員工的工資符合排名前N的標(biāo)準(zhǔn),那么它們也同樣會由WITH TIES語句獲取。
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC FETCH FIRST 10 ROWS ONLY WITH TIES; |
以下示例限制從EMP表中獲取排名前10%的記錄:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC FETCH FIRST 10 PERCENT ROWS ONLY; |
以下示例忽略前5條記錄并會顯示表的下5條記錄:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; |
所有這些限制同樣可以很好的應(yīng)用于PL/SQL塊。
BEGIN SELECT sal BULK COLLECT INTO sal_v FROM EMP FETCH FIRST 100 ROWS ONLY; END; |
對SQL*Plus的各種增強(qiáng)
SQL*Plus的隱式結(jié)果:12c中,在沒有實(shí)際綁定某個(gè)RefCursor的情況下,SQL*Plus從一個(gè)PL/SQL塊的一個(gè)隱式游標(biāo)返回結(jié)果。這一新的dbms_sql.return_result過程將會對PL/SQL 塊中由SELECT 語句查詢所指定的結(jié)果加以返回并進(jìn)行格式化。以下代碼對此用法進(jìn)行了描述:
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; |
當(dāng)此過程得以執(zhí)行,會在SQL*Plus上返回格式化的記錄。
顯示不可見字段:在本系列文章的第一部分,我已經(jīng)對不可見字段的新特性做了相關(guān)闡述。當(dāng)字段定義為不可見時(shí),在描述表結(jié)構(gòu)時(shí)它們將不會顯示。然而,你可以通過在SQL*Plus提示符下進(jìn)行以下設(shè)置來顯示不可見字段的相關(guān)信息:
SQL> SET COLINVISIBLE ON|OFF |
以上設(shè)置僅對DESCRIBE 命令有效。目前它還無法對不可見字段上的SELECT 語句結(jié)果產(chǎn)生效果。
會話級序列
在12c中現(xiàn)在可以創(chuàng)建新的會話級數(shù)據(jù)庫序列來支持會話級序列值。這些序列的類型在有會話級的全局臨時(shí)表上最為適用。
會話級序列會產(chǎn)生一個(gè)獨(dú)特范圍的值,這些值是限制在此會話內(nèi)的,而非超越此會話。一旦會話終止,會話序列的狀態(tài)也會消失。以下示例解釋了創(chuàng)建一個(gè)會話級序列:
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更快的運(yùn)行PL/SQL函數(shù)或過程,這些是由SQL語句的WITH語句加以定義和聲明的。以下示例演示了如何在WITH語句中定義和聲明一個(gè)過程或函數(shù):
WITH PROCEDURE|FUNCTION test1 (…) BEGIN END; SELECT FROM table_name; / |
盡管你不能在PL/SQL單元直接使用WITH語句,但其可以在PL/SQL單元中通過一個(gè)動(dòng)態(tài)SQL加以引用。
擴(kuò)展數(shù)據(jù)類型
在12c中,與早期版本相比,諸如VARCHAR2, NAVARCHAR2以及 RAW這些數(shù)據(jù)類型的大小會從4K以及2K字節(jié)擴(kuò)展至32K字節(jié)。只要可能,擴(kuò)展字符的大小會降低對LOB數(shù)據(jù)類型的使用。為了啟用擴(kuò)展字符大小,你必須將MAX_STRING_SIZE的初始數(shù)據(jù)庫參數(shù)設(shè)置為EXTENDED。
要使用擴(kuò)展字符類型需要執(zhí)行以下過程:
1. 關(guān)閉數(shù)據(jù)庫
2. 以升級模式重啟數(shù)據(jù)庫
3. 更改參數(shù): ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED;
4. 執(zhí)行 utl32k.sql as sysdba : SQL> @?/rdbms/admin/utl32k.sql
5. 關(guān)閉數(shù)據(jù)庫
6. 以讀寫模式重啟數(shù)據(jù)庫
對比LOB數(shù)據(jù)類型,在ASSM表空間管理中,擴(kuò)展數(shù)據(jù)類型的字段以SecureFiles LOB加以存儲,而在非ASSM表空間管理中,它們則是以BasciFiles LOB進(jìn)行存儲的。
注意:一旦更改,你就不能再將設(shè)置改回STANDARD。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。