ORACLE數(shù)據(jù)庫(kù)分冊(cè)_第1頁(yè)
ORACLE數(shù)據(jù)庫(kù)分冊(cè)_第2頁(yè)
ORACLE數(shù)據(jù)庫(kù)分冊(cè)_第3頁(yè)
ORACLE數(shù)據(jù)庫(kù)分冊(cè)_第4頁(yè)
ORACLE數(shù)據(jù)庫(kù)分冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、經(jīng)營(yíng)分析系統(tǒng)員工培訓(xùn)文檔 -ORACLE數(shù)據(jù)庫(kù)分冊(cè) Vesion 1.0SQLPL/SQL.PL/SQL來(lái)源針對(duì)SQL92標(biāo)準(zhǔn),各數(shù)據(jù)庫(kù)廠商在標(biāo)準(zhǔn)基礎(chǔ)上做了一定的擴(kuò)展,SQL SERVER的擴(kuò)展語(yǔ)言叫T-SQL,PL/SQL是ORACLE對(duì)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)語(yǔ)言的擴(kuò)展,ORACLE公司已經(jīng)將PL/SQL整合到ORACLE 服務(wù)器和其他工具中了,近幾年中更多的開(kāi)發(fā)人員和DBA開(kāi)始使用PL/SQL,本文將講述PL/SQL基礎(chǔ)語(yǔ)法,結(jié)構(gòu)和組件、以及如何設(shè)計(jì)并執(zhí)行一個(gè)PL/SQL程序。 PL/SQL從版本6開(kāi)始PL/SQL就被可靠的整合到ORACLE中了。PL/SQL 不是一個(gè)獨(dú)立的產(chǎn)品,他是一個(gè)整合到ORA

2、CLE服務(wù)器和ORACLE工具中的技術(shù),可以把PL/SQL看作ORACLE服務(wù)器內(nèi)的一個(gè)引擎,sql語(yǔ)句執(zhí)行者處理單個(gè)的sql語(yǔ)句,PL/SQL引擎處理PL/SQL程序塊。當(dāng)PL/SQL程序塊在PL/SQL引擎處理時(shí),ORACLE服務(wù)器中的SQL語(yǔ)句執(zhí)行器處理pl/sql程序塊中的SQL語(yǔ)句。 PL/SQL的優(yōu)點(diǎn)如下: PL/SQL是一種高性能的基于事務(wù)處理的語(yǔ)言,能運(yùn)行在任何ORACLE環(huán)境中,支持所有數(shù)據(jù)處理命令。通過(guò)使用PL/SQL程序單元處理SQL的數(shù)據(jù)定義和數(shù)據(jù)控制元素。 PL/SQL支持所有SQL數(shù)據(jù)類型和所有SQL函數(shù),同時(shí)支持所有ORACLE對(duì)象類型 PL/SQL塊可以被命名和

3、存儲(chǔ)在ORACLE服務(wù)器中,同時(shí)也能被其他的PL/SQL程序或SQL命令調(diào)用,任何客戶/服務(wù)器工具都能訪問(wèn)PL/SQL程序,具有很好的可重用性。 可以使用ORACLE數(shù)據(jù)工具管理存儲(chǔ)在服務(wù)器中的PL/SQL程序的安全性。可以授權(quán)或撤銷數(shù)據(jù)庫(kù)其他用戶訪問(wèn)PL/SQL程序的能力。 PL/SQL代碼可以使用任何ASCII文本編輯器編寫(xiě),所以對(duì)任何ORACLE能夠運(yùn)行的操作系統(tǒng)都是非常便利的 對(duì)于SQL,ORACLE必須在同一時(shí)間處理每一條SQL語(yǔ)句,在網(wǎng)絡(luò)環(huán)境下這就意味作每一個(gè)獨(dú)立的調(diào)用都必須被oracle服務(wù)器處理,這就占用大量的服務(wù)器時(shí)間,同時(shí)導(dǎo)致網(wǎng)絡(luò)擁擠。而PL/SQL是以整個(gè)語(yǔ)句塊發(fā)給服務(wù)器

4、,這就降低了網(wǎng)絡(luò)擁擠。.PL/SQL基本結(jié)構(gòu)PL/SQL是Oracle對(duì)SQL規(guī)范的擴(kuò)展,是一種塊結(jié)構(gòu)語(yǔ)言,即構(gòu)成一個(gè)PL/SQL程序的基本單位(過(guò)程、函數(shù)和無(wú)名塊)是邏輯塊,可包含任何數(shù)目的嵌套了快。這種程序結(jié)構(gòu)支持逐步求精方法解決問(wèn)題。一個(gè)塊(或子塊)將邏輯上相關(guān)的說(shuō)明和語(yǔ)句組合在一起,其形式為:DECLARE-說(shuō)明BEGIN-語(yǔ)句序列EXCEPTION-例外處理程序END;PL/SQL機(jī)可執(zhí)行過(guò)程性語(yǔ)句,而將SQL語(yǔ)句發(fā)送到ORACLE服務(wù)器上的SQL語(yǔ)句執(zhí)行器。在ORACLE預(yù)編譯程序或OCI程序中可嵌入無(wú)名的PL/SQL塊。如果ORACLE具有PROCEDURAL選件,有名的PL/S

5、QL塊(子程序)可單獨(dú)編譯,永久地存儲(chǔ)在數(shù)據(jù)庫(kù)中,準(zhǔn)備執(zhí)行。除非特別指明,SQL不區(qū)分大小寫(xiě)SQL可以在一行或者多行輸入關(guān)鍵字不能分開(kāi)子句通常放在單獨(dú)的行中使用縮進(jìn)是為了提高代碼可讀性關(guān)鍵字通常使用大寫(xiě)字母輸入,其他文字用小寫(xiě)輸入.數(shù)據(jù)類型.1.預(yù)定義數(shù)據(jù)類型Oracle的數(shù)據(jù)類型可以分為四類,分別是標(biāo)量類型,復(fù)合類型,引用類型和LOB類型。標(biāo)量類型沒(méi)有內(nèi)部組件;而復(fù)合類型包含了能夠被單獨(dú)操作的內(nèi)部組件;引用類型類似于3G語(yǔ)言中的指針,能夠引用一個(gè)值;LOB類型的值就是一個(gè)lob定位器,能夠指示出大對(duì)象(如圖像)的存儲(chǔ)位置。下圖是在PL/SQL中可以使用的預(yù)定義類型,其中標(biāo)量類型又分為四類:數(shù)

6、字、字符、布爾和日期/時(shí)間。數(shù)字型數(shù)字類型可以存儲(chǔ)整數(shù)、實(shí)數(shù)和浮點(diǎn)數(shù),可以表示數(shù)值的大小,參與計(jì)算。 BINARY_INTEGER 我們可以使用BINARY_INTEGER數(shù)據(jù)類型來(lái)存儲(chǔ)有符號(hào)整數(shù)。它的范圍是-2*31至2*31。跟PLS_INTEGER一樣,BINARY_INTEGER所需的存儲(chǔ)空間也要小于NUMBER。但是,大多數(shù)的BINARY_INTEGER操作要比PLS_INTEGER操作慢。 BINARY_INTEGER子類型 所謂的基類型,就是有子類型繼承于它。子類型在基類型的基礎(chǔ)上添加一些約束限制,也可能重新定義數(shù)值范圍。為了使用方便,PL/SQL預(yù)定義了下面幾個(gè)BINARY_I

7、NTEGER的子類。 NATURAL NATURALN POSITIVE POSITIVEN SIGNTYPE 子類型NATURAL和POSITIVE能讓我們將一個(gè)整數(shù)變量的取值范圍分別限制在非負(fù)數(shù)和正整數(shù)之內(nèi)。NATURALN和POSITIVEN不允許為整數(shù)類型變量賦空值。SIGNTYPE把整數(shù)的取值范圍限定在-1,0,1,這在編程中很適合表示三態(tài)邏輯(tri-state logic)。 NUMBER 我們可以使用NUMBER數(shù)據(jù)類型來(lái)存儲(chǔ)定點(diǎn)或浮點(diǎn)數(shù)。它的范圍是1E-130至10E125。如果表達(dá)式的值超過(guò)這個(gè)范圍,我們就會(huì)得到數(shù)字溢出錯(cuò)誤(a numeric overflow or un

8、derflow error)。我們可以為要存儲(chǔ)的數(shù)字指定精度,包括數(shù)字的全長(zhǎng)和小數(shù)長(zhǎng)度。語(yǔ)法如下: NUMBER(precision,scale) 其中precision表示數(shù)字的總長(zhǎng)度,scale代表可以有幾位小數(shù)。如果要使用浮點(diǎn)數(shù)的話,就不能指定長(zhǎng)度和精度,像下面這樣聲明就可以了:NUMBER 聲明整數(shù)直接使用下面的語(yǔ)法:NUMBER(precision) - same as NUMBER(precision,0) 不可以用常量或變量指定NUMBER的長(zhǎng)度和精度。NUMBER類型最大的長(zhǎng)度是38位。如果不指定NUMBER類型的最大長(zhǎng)度,就會(huì)默認(rèn)采用這個(gè)長(zhǎng)度或是使用系統(tǒng)所支持的最大長(zhǎng)度。sc

9、ale的范圍從-84到127,能夠決定舍入規(guī)則。例如,一個(gè)scale值為2的數(shù)字,舍入后的小數(shù)部分將是最接原小數(shù)部分的百分位數(shù)(3.456舍入為3.46)。如果scale是負(fù)數(shù),它就會(huì)從小數(shù)點(diǎn)左邊開(kāi)始進(jìn)行舍入操作。如scale值為-3的數(shù)字舍入后的結(jié)果將是最接近原值的千位數(shù)(3456舍入為3000)。scale為零的數(shù)字舍入后的結(jié)果還是本身。如果我們不指定scale的值,默認(rèn)就為0。NUMBER子類型 為了能和ANSI/ISO和IBM類型兼容或是想使用一個(gè)更加有描述性意義的名字,我們就可以使用下面的NUMBER子類型。 DEC DECIMAL DOUBLE PRECISION FLOAT IN

10、TEGER INT NUMERIC REAL SMALLINT 使用DEC、DECIMAL和NUMBERIC可以聲明最大精度為38位十進(jìn)制數(shù)字的定點(diǎn)數(shù)字。而使用DOUBLE PRECISION和FLOAT可以聲明最大精度為126位二進(jìn)制數(shù)字的浮點(diǎn)數(shù)字,大約相當(dāng)于38位十進(jìn)制數(shù)字?;蚴鞘褂肦EAL聲明最大精度為63位二進(jìn)制數(shù)字的浮點(diǎn)數(shù)字,大約相當(dāng)于18位十進(jìn)制數(shù)字。INTEGER、INT和SMALLINT可以聲明最大精度為38位十進(jìn)制數(shù)字的整數(shù)。 PLS_INTEGER 我們可以使用PLS_INTEGER數(shù)據(jù)類型來(lái)存儲(chǔ)有符號(hào)整數(shù)。它的取值范圍在-2*31至2*31之間。PLS_INTEGER所需

11、的存儲(chǔ)空間要比NUMBER少,運(yùn)算的速度要高于NUMBER和BINARY_INTEGER。雖然PLS_INTEGER和BINARY_INTEGER的取值范圍一樣,但它們不完全兼容。PLS_INTEGER在運(yùn)算時(shí)如果有溢出,則會(huì)有異常拋出,而B(niǎo)IANRY_INTEGER發(fā)生溢出時(shí),如果結(jié)果是要賦給一個(gè)NUMBER類型的變量時(shí),就不會(huì)有異常拋出。為了考慮兼容性,我們?nèi)钥梢栽谂f的應(yīng)用程序中使用BINARY_INTEGER;但在新的應(yīng)用程序中,PLS_INTEGER會(huì)帶來(lái)更好的性能。 字符型字符類型可以存放字符和數(shù)字混合的數(shù)據(jù),表現(xiàn)詞和文章,操作字符串。CHAR 我們可以使用CHAR類型來(lái)存儲(chǔ)定長(zhǎng)的字

12、符數(shù)據(jù)。但該數(shù)據(jù)的內(nèi)部表現(xiàn)形式是取決于數(shù)據(jù)庫(kù)字符集的。CHAR類型有一個(gè)用于指定最大長(zhǎng)度的可選參數(shù),長(zhǎng)度范圍在1到32767字節(jié)之間。我們可以采用字節(jié)或字符的形式來(lái)設(shè)置該參數(shù)。語(yǔ)法如下:CHAR(maximum_size CHAR | BYTE ) maximum_size不能是常量或變量,只能是范圍在1到32767之間的整數(shù)文字。如果我們不指定最大值,它默認(rèn)是1。如果我們用字節(jié)形式指定最大值,有時(shí)就會(huì)出現(xiàn)空間不足的問(wèn)題(多字節(jié)字符會(huì)占用多于一個(gè)字節(jié)的空間)。為了避免這樣的問(wèn)題發(fā)生,我們可以采用按照字符的方式指定其最大值,這樣,即使是那些包含多個(gè)字節(jié)的參數(shù)可以被靈活地存儲(chǔ)下來(lái)。按照字符指定長(zhǎng)度

13、的方式,上限大小仍舊是32767字節(jié),所以,對(duì)于雙字節(jié)和多字節(jié)的字符集,我們可以使用字節(jié)最大長(zhǎng)度的一半或三分之一作為最大字符個(gè)數(shù)。 雖然PL/SQL字符變量的長(zhǎng)度相對(duì)來(lái)說(shuō)比較長(zhǎng),但CHAR類型在數(shù)據(jù)庫(kù)的字段中最大存儲(chǔ)長(zhǎng)度為2000個(gè)字節(jié),所以,我們不能往數(shù)據(jù)庫(kù)CHAR類型字段中插入超過(guò)2000個(gè)字節(jié)的字符。但是,我們可以把任意CHAR(n)插入LONG類型的字段中,因?yàn)長(zhǎng)ONG的最大長(zhǎng)度是2*31字節(jié)或是2G(gigabyte)。如果我們不使用CHAR或BYTE來(lái)對(duì)字符類型長(zhǎng)度進(jìn)行限制的話,初始化參數(shù)NLS_LENGTH_SEMANTICS會(huì)決定默認(rèn)長(zhǎng)度大小的。CHAR的子類型CHARACTE

14、R和CHAR有著相同的取值范圍。也就是說(shuō),CHARACTER只是CHAR的一個(gè)別名而已。這個(gè)子類型能與ANSI/ISO和IBM類型相兼容。 LONG和LONG RAW 我們可以使用LONG類型來(lái)存儲(chǔ)變長(zhǎng)的字符串。除了LONG類型的最大長(zhǎng)度是32760字節(jié)之外,LONG類型和VARCHAR2很相像。我們還可以使用LONG RAW類型來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)或二進(jìn)制字符串。LONG RAW和LONG類似,但是它不會(huì)被PL/SQL解析。LONG RAW的最大長(zhǎng)度也是32760字節(jié)。從9i開(kāi)始,LOB類型變量可以與LONG和LONG RAW類型交換使用。Oracle推薦將LONG和LONG RAW都對(duì)應(yīng)的轉(zhuǎn)換

15、成COLB和BLOB類型。 我們可以將LONG類型的值插入字段類型為L(zhǎng)ONG的數(shù)據(jù)庫(kù)中,因?yàn)樵跀?shù)據(jù)庫(kù)中LONG的長(zhǎng)度是2*31字節(jié);但是,不可以從LONG字段中檢索超過(guò)32760字節(jié)的字符放到LONG類型變量中去。同樣,對(duì)于LONG RAW類型來(lái)說(shuō),這條規(guī)則同樣適用,在數(shù)據(jù)庫(kù)中它的最大長(zhǎng)度也是2*31字節(jié),而變量的長(zhǎng)度在32760字節(jié)以內(nèi)。LONG類型字段可以存儲(chǔ)文本、字符數(shù)組或短文等。我們可以對(duì)LONG字段進(jìn)行UPDATE、INSERT和SELECT操作,但不能在表達(dá)式、SQL函數(shù)調(diào)用、或某個(gè)SQL子句(如:WHERE、GROUP BY和CONNECT BY)中使用它。 注意:在SQL語(yǔ)句中

16、,PL/SQL會(huì)將LONG類型的值綁定成VARCHAR2類型,而不是LONG。但是,如果被綁定的VARCHAR2值超過(guò)4000個(gè)字節(jié),Oracle會(huì)自動(dòng)地將綁定類型轉(zhuǎn)成LONG,但LONG并不能應(yīng)用在SQL函數(shù)中,所以,這時(shí)我們就會(huì)得到一個(gè)錯(cuò)誤消息。 RAW 我們可以使用RAW數(shù)據(jù)類型來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)或字節(jié)串。例如,一個(gè)RAW類型的變量可以存儲(chǔ)一個(gè)數(shù)字化圖形。RAW類型數(shù)據(jù)和VARCHAR2類型數(shù)據(jù)類似,只是PL/SQL不對(duì)其進(jìn)行解析而已。同樣,在我們把RAW數(shù)據(jù)從一個(gè)系統(tǒng)傳到另一個(gè)系統(tǒng)時(shí),Oracle Net也不會(huì)對(duì)它做字符集轉(zhuǎn)換。RAW類型包含了一個(gè)可以讓我們指定最大長(zhǎng)度的可選參數(shù),上限為

17、32767字節(jié),語(yǔ)法如下:RAW(maximum_size) 我們不能使用常量或變量來(lái)指定這個(gè)參數(shù);而且參數(shù)的范圍必須是在1到32767范圍內(nèi)。在數(shù)據(jù)庫(kù)中RAW類型字段的最大長(zhǎng)度是2000個(gè)字節(jié),所以,不可以把超過(guò)2000字節(jié)的內(nèi)容放到RAW類型字段中。我們可以把任何RAW類型插入到LONG RAW類型的數(shù)據(jù)庫(kù)字段中,因?yàn)長(zhǎng)ONG RAW在數(shù)據(jù)庫(kù)中是2*31,但是不能把超過(guò)32767字節(jié)的LONG RAW類型放入RAW變量中。 ROWID和UROWID 在Oracle內(nèi)部,每個(gè)數(shù)據(jù)表都有一個(gè)偽列ROWID,用于存放被稱為ROWID的二進(jìn)制值。每個(gè)ROWID代表了一行數(shù)據(jù)的存儲(chǔ)地址。物理ROWI

18、D能夠標(biāo)識(shí)普通數(shù)據(jù)表中的一行信息,而邏輯ROWID能夠標(biāo)識(shí)索引組織表(index-organized table)中的一行信息。其中ROWID類型只能存儲(chǔ)物理內(nèi)容,而UROWID(universal rowid)類型可以存儲(chǔ)物理,邏輯或外來(lái)(non-Oracle)ROWID。 建議:只有在舊的應(yīng)用程序中,為了兼容性我們才使用ROWID數(shù)據(jù)類型。對(duì)于新的應(yīng)用程序,應(yīng)該使用UROWID數(shù)據(jù)類型。 當(dāng)我們把查詢出來(lái)的ROWID放到ROWID變量時(shí),可以使用內(nèi)置函數(shù)ROWIDTOCHAR,這個(gè)函數(shù)能把二進(jìn)制內(nèi)容轉(zhuǎn)換成18個(gè)字節(jié)的字符串;還有一個(gè)與之對(duì)應(yīng)的CHARTOROWID函數(shù),可以對(duì)該過(guò)程進(jìn)行反操

19、作,如果轉(zhuǎn)換過(guò)程中發(fā)現(xiàn)字符串并不是一個(gè)有效的ROWID時(shí),PL/SQL就會(huì)拋出預(yù)定義異常SYS_INVALID_ROWID。UROWID變量和字符串之間進(jìn)行轉(zhuǎn)換也可以直接使用賦值操作符。這時(shí),系統(tǒng)會(huì)隱式地實(shí)現(xiàn)UROWID和字符類型之間的轉(zhuǎn)換。 物理ROWID(Physical Rowid)可以讓我們快速的訪問(wèn)某些特定的行。只要行存在,它的物理ROWID就不會(huì)改變。高效穩(wěn)定的物理ROWID在查詢行集合、操作整個(gè)集合和更新子集是很有用的。例如,我們可以在UPDATE或DELETE語(yǔ)句的WHERE子句中比較UROWID變量和ROWID偽列來(lái)找出最近一次從游標(biāo)中取出的行數(shù)據(jù)。 物理ROWID有兩種形式

20、。10字節(jié)擴(kuò)展ROWID格式(10-byte extended rowid format)支持相對(duì)表空間塊地址并能辨識(shí)分區(qū)表和非分區(qū)表中的行記錄。6字節(jié)限定ROWID格式支持向后兼容。 擴(kuò)展ROWID使用檢索出來(lái)的每一行記錄的物理地址的base-64編碼。例如,在SQL*Plus(隱式地將ROWID轉(zhuǎn)換成字符串)中的查詢: SQL SELECT ROWID, enameSQL FROM empSQL WHERE empno = 7788;ROWID ENAME- -AAAAqcAABAAADFNAAH SCOTT OOOOOOFFFBBBBBBRRR這樣的形式有四部分組成: 000000代表數(shù)

21、據(jù)對(duì)象號(hào)(data object number),如上例中的AAAAqc,能夠辨識(shí)數(shù)據(jù)庫(kù)段。同一段中的模式對(duì)象,都有著相同的數(shù)據(jù)對(duì)象號(hào)。 FFF代表文件號(hào)(file number),如上例中的AAB,能辨識(shí)出包含行的數(shù)據(jù)文件。在數(shù)據(jù)庫(kù)中,文件號(hào)是唯一的。 BBBBBB代表塊號(hào)(block number),如上例中的AAADFN,能辨識(shí)出包含行的數(shù)據(jù)塊。塊號(hào)是與它們所在的數(shù)據(jù)文件相關(guān),而不是表空間。所以,兩個(gè)在同一表空間的行數(shù)據(jù),如果它們處于不同的數(shù)據(jù)文件中,也可能有著相同的塊號(hào)。 RRR代表了行號(hào)(row number),如上例中的AAH,可以辨識(shí)塊中的行數(shù)據(jù)。 邏輯ROWID為訪問(wèn)特定行提供

22、了最快的訪問(wèn)速度。Oracle在索引組織表基礎(chǔ)上使用它們構(gòu)建二級(jí)索引。邏輯ROWID沒(méi)有持久的物理地址,當(dāng)新數(shù)據(jù)被插入時(shí),它的值就會(huì)在數(shù)據(jù)塊上偏移。但是,如果一個(gè)行數(shù)據(jù)的物理位置發(fā)生變化,它的邏輯ROWID就無(wú)效了。 VARCHAR2 我們可以使用VARCHAR2類型來(lái)存儲(chǔ)變長(zhǎng)的字符數(shù)據(jù)。至于數(shù)據(jù)在數(shù)據(jù)庫(kù)中的內(nèi)部表現(xiàn)形式要取決于數(shù)據(jù)庫(kù)的字符集。VARCHAR2類型需要指明數(shù)據(jù)長(zhǎng)度,這個(gè)參數(shù)的上限是32767字節(jié)。語(yǔ)法如下: VARCHAR2(maximum_size CHAR | BYTE) 我們不能使用常量或變量來(lái)指定maximum_size值,maximum_size值的有效范圍在1到32

23、767之間。對(duì)于長(zhǎng)度不同的VARCHAR2類型數(shù)據(jù),PL/SQL對(duì)它們的處理方式也是不同的。值小的PL/SQL會(huì)優(yōu)先考慮到它的性能問(wèn)題,而對(duì)于值大的PL/SQL會(huì)優(yōu)先考慮到內(nèi)存的使用效率問(wèn)題。截止點(diǎn)(cutoff point)為2000個(gè)字節(jié)。在2000字節(jié)以下,PL/SQL會(huì)一次性分配我們聲明時(shí)所指定大小的空間容納實(shí)際的值;2000字節(jié)或2000字節(jié)以上時(shí),PL/SQL會(huì)動(dòng)態(tài)的分配VARCHAR2的存儲(chǔ)容量。比如我們聲明兩個(gè)VARCHAR2類型的變量,一個(gè)長(zhǎng)度是1999字節(jié),一個(gè)是2000字節(jié),如果我們把長(zhǎng)度為500字節(jié)的值分別分配給這兩個(gè)變量,那么前者占用的空間就是1999字節(jié)而后者只需5

24、00字節(jié)。如果我們采用字節(jié)形式而非字符形式指定最大值時(shí),VARCHAR2(n)變量就有可能太小而不能容納n個(gè)多字節(jié)字符。為了避免這個(gè)問(wèn)題,就要使用VARCHAR2(n CHAR)形式進(jìn)行定義,這樣,即使字符中包含多字節(jié)字符也不會(huì)出問(wèn)題。所以,對(duì)于雙字節(jié)或多字節(jié)字符集,我們可以指定單字節(jié)字符集中字符個(gè)數(shù)的1/2或1/3。雖然PL/SQL字符變量相對(duì)比較長(zhǎng),但VARCHAR2類型的數(shù)據(jù)庫(kù)字段最大長(zhǎng)度為4000個(gè)字節(jié)。所以,不能把字節(jié)超過(guò)4000的VARCHAR2類型值插入VARCHAR2類型的數(shù)據(jù)庫(kù)字段中。我們可以把任何VARCHAR2(n)值插入一個(gè)LONG類型的數(shù)據(jù)庫(kù)字段,因?yàn)長(zhǎng)ONG字段最大

25、長(zhǎng)度為2*31字節(jié)。但是,不能把LONG字段中檢索出來(lái)的長(zhǎng)度超過(guò)32767字節(jié)的值放到VARCHAR2(n)變量中。如果聲明時(shí)不使用CHAR或BYTE限定修飾詞,初始化參數(shù)NLS_LENGTH_SEMANTICS會(huì)決定默認(rèn)的設(shè)置。當(dāng)PL/SQL過(guò)程編譯時(shí),這個(gè)參數(shù)的設(shè)置就會(huì)被記錄下來(lái),這樣,當(dāng)過(guò)程失效后被重新編譯時(shí)就會(huì)被重新使用。VARCHAR2的子類型 下面VARCHAR2的子類型的范圍與VARCHAR2完全相同,它們只是VARCHAR2的一個(gè)別名而已。 STRING VARCHAR 我們可以使用這些子類型來(lái)與ANSI/ISO和IBM類型兼容。注意:目前,VARCHAR和VARCHAR2有著

26、相同意義,但是在以后的PL/SQL版本中,為了符合SQL標(biāo)準(zhǔn),VARCHAR有可能會(huì)作為一個(gè)單獨(dú)的類型出現(xiàn)。所以最好使用VARCHAR2,而不是VARCHAR。 本地字符型被廣泛使用的單字節(jié)ASCII和EBCDIC字符集很適合表現(xiàn)羅馬字符,但有些亞洲語(yǔ)言,如漢語(yǔ)、日語(yǔ)等包含了成千上萬(wàn)個(gè)字符,這些語(yǔ)言中的一個(gè)字符就需要用兩個(gè)或三個(gè)字節(jié)來(lái)表示。為了處理這些語(yǔ)言,Oracle提供了全球化支持,允許我們處理單字節(jié)和多字節(jié)字符數(shù)據(jù),并在字符集之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換。Oracle還能讓我們的應(yīng)用程序運(yùn)行在不同的語(yǔ)言環(huán)境中。有了全球化支持,數(shù)字和日期格式會(huì)根據(jù)用戶會(huì)話中所指定的語(yǔ)言約定(language conv

27、ention)而自動(dòng)進(jìn)行調(diào)節(jié)。因此,全世界的用戶可以使用他們母語(yǔ)來(lái)使用Oracle。 Oracle支持兩種數(shù)據(jù)庫(kù)字符集和一種國(guó)家特有字符集,前者用于標(biāo)識(shí)符和源代碼,后者用于國(guó)家特有語(yǔ)言數(shù)據(jù)。NCHAR和NVARCHAR2類型用于存儲(chǔ)本地字符集。注意,當(dāng)在數(shù)據(jù)庫(kù)的不同字符集之間轉(zhuǎn)換CHAR或VARCHAR2數(shù)據(jù)時(shí),要確保數(shù)據(jù)保持良好的形式(well-formed)。比較UTF8和AL16UTF16編碼 國(guó)家特有字符集使用Unicode來(lái)表現(xiàn)數(shù)據(jù),采用UTF8或AL16UTF16編碼。 每個(gè)使用AL16UTF16編碼的字符都占用2個(gè)字節(jié)。這將簡(jiǎn)化字符串的長(zhǎng)度計(jì)算,避免采用混合語(yǔ)言編程時(shí)發(fā)生截?cái)噱e(cuò)誤

28、,但是這會(huì)比ASCII字符所組成的字符串需要更多空間。 每個(gè)使用UTF8編碼的字符占用1、2或3個(gè)字節(jié)。這就能讓我們把更多的字符放到變量或數(shù)據(jù)表的字段中,但這只是在大多數(shù)字符用單字節(jié)形式表現(xiàn)的條件下才能做到。這種編碼在傳遞數(shù)據(jù)到字節(jié)緩沖器時(shí)可能會(huì)引起截?cái)噱e(cuò)誤。 Oracle公司推薦使用默認(rèn)的AL16UTF16編碼,這樣可以獲取最大的運(yùn)行時(shí)可靠性。如果想知道一個(gè)Unicode字符串占用多少字節(jié),就要使用LENGTHB函數(shù),而不是LENGTH。 NCHAR 我們用NCHAR類型來(lái)儲(chǔ)存定長(zhǎng)國(guó)家特有字符數(shù)據(jù)。數(shù)據(jù)的內(nèi)部表現(xiàn)取決于數(shù)據(jù)庫(kù)創(chuàng)建時(shí)指定的國(guó)家特有字符集,字符集可能采用變長(zhǎng)編碼(UTF8)或定長(zhǎng)

29、編碼(AL16UTF16)。因?yàn)檫@種類型總是與多字節(jié)字符兼容,所以我們可以使用它支持任何Unicode字符數(shù)據(jù)。 NCHAR數(shù)據(jù)類型可接受一個(gè)可選參數(shù)來(lái)讓我們指定字符的最大長(zhǎng)度。語(yǔ)法如下: NCHAR(maximum_size) 因?yàn)槲锢硐拗剖?2767個(gè)字節(jié),所以在AL16UTF16編碼格式下最大長(zhǎng)度為32767/2,UTF8編碼格式下是32767/3。我們不能使用常量或變量來(lái)指定最大值,只能使用整數(shù)文字。如果我們沒(méi)有指定最大長(zhǎng)度,它默認(rèn)值就為1。這個(gè)值總是代表字符的個(gè)數(shù),不像CHAR類型,既可以采用字符形式又可以采用字節(jié)形式。my_string NCHAR(100); - maximum

30、size is 100 characters NCHAR在數(shù)據(jù)庫(kù)字段中的最大寬度是2000字節(jié)。所以,我們不能向NCHAR字段中插入值超過(guò)2000字節(jié)的內(nèi)容。如果NCHAR的值比NCHAR字段定義的寬度要小,Oracle就會(huì)自動(dòng)補(bǔ)上空格,填滿定義的寬度。我們可以在語(yǔ)句和表達(dá)式中交互使用CHAR和NCHAR值。從CHAR轉(zhuǎn)到NCHAR總是安全的,但在NCHAR值轉(zhuǎn)換到CHAR的過(guò)程中,如果CHAR類型不能完全表現(xiàn)NCHAR類型的值,就會(huì)引起數(shù)據(jù)丟失。這樣的數(shù)據(jù)丟失會(huì)導(dǎo)致字符看起來(lái)像問(wèn)號(hào)(?)。NVARCHAR2 我們可以使用NVARCHAR2數(shù)據(jù)類型來(lái)存儲(chǔ)變長(zhǎng)的Unicode字符數(shù)據(jù)。數(shù)據(jù)的內(nèi)部

31、表現(xiàn)取決于數(shù)據(jù)庫(kù)創(chuàng)建時(shí)所指定的國(guó)家特有字符集,它有可能采用變長(zhǎng)編碼(UTF8)或是定長(zhǎng)編碼(AL16UTF16)。因?yàn)檫@個(gè)類型總與多字節(jié)兼容,我們可以用它來(lái)支持Unicode字符數(shù)據(jù)。NVARCHAR2數(shù)據(jù)類型需要接受一個(gè)指定最大大小的參數(shù)。語(yǔ)法如下:NVARCHAR2(maximum_size) 因?yàn)槲锢硐拗剖?2767個(gè)字節(jié),所以在AL16UTF16編碼格式下最大長(zhǎng)度為32767/2,UTF8編碼格式下是32767/3。我們不能使用常量或變量來(lái)指定最大值,只能使用整數(shù)文字。最大值總是代表字符的個(gè)數(shù),不像CHAR類型,既可以采用字符形式又可以采用字節(jié)形式。my_string NVARCHAR

32、2(200); - maximum size is 200 characters NVARCHAR2在數(shù)據(jù)庫(kù)字段中的最大寬度是4000字節(jié)。所以,我們不能向NVARCHAR2字段中插入長(zhǎng)度超過(guò)4000字節(jié)的值。我們可以在語(yǔ)句和表達(dá)式中交互使用VARCHAR2和NVARCHAR2值。從VARCHAR2向NVARCHAR2轉(zhuǎn)換總是安全的,但在NVARCHAR2值轉(zhuǎn)換到VARCHAR2的過(guò)程中,如果VARCHAR2類型不能完全表現(xiàn)NVARCHAR2類型的值,就會(huì)引起數(shù)據(jù)丟失。這樣的數(shù)據(jù)丟失會(huì)導(dǎo)致字符看起來(lái)像問(wèn)號(hào)(?)。LOB類型LOB(large object)數(shù)據(jù)類型BFILE、BLOB、CLOB

33、和NCLOB可以最大存儲(chǔ)4G的無(wú)結(jié)構(gòu)數(shù)據(jù)(例如:文本、圖形、視頻剪輯和音頻等)塊。并且,它們?cè)试S高效地隨機(jī)地分段訪問(wèn)數(shù)據(jù)。LOB類型和LONG、LONG RAW類型相比有幾個(gè)不同的地方。比如,LOB(除了NCOLB)可以作為對(duì)象類型的一個(gè)屬性,但LONG類型不可以。LOB的最大值是4G,而LONG只有2G。LOB支持隨機(jī)訪問(wèn)數(shù)據(jù),但LONG只支持順序訪問(wèn)。LOB類型中可以存儲(chǔ)了LOB定位器,它能夠指向存放于外部文件中的大對(duì)象,in-line (inside the row)或out-of-line (outside the row)的形式。BLOB、CLOB、NCLOB或BFILE類型的數(shù)據(jù)庫(kù)

34、字段存儲(chǔ)了定位器。其中BLOB、CLOB和NCLOB的數(shù)據(jù)存在數(shù)據(jù)庫(kù)中,in-line (inside the row)或out-of-line (outside the row)的形式,而B(niǎo)FILE數(shù)據(jù)存在數(shù)據(jù)庫(kù)之外的操作系統(tǒng)文件中。PL/SQL是通過(guò)定位器來(lái)操作LOB的。例如,當(dāng)我們查詢出一個(gè)BLOB值,只有定位器被返回。如果在事務(wù)中得到定位器,LOB定位器就會(huì)包含事務(wù)的ID號(hào),這樣我們就不能在另外一個(gè)事務(wù)中更新LOB內(nèi)容了。同樣,我們也不能在一個(gè)會(huì)話中操作另外一個(gè)會(huì)話中的定位器。 從9i開(kāi)始,我們也可以把CLOB類型轉(zhuǎn)成CHAR和VARCHAR2類型或是把BLOB轉(zhuǎn)成RAW,反之亦然,這

35、樣,我們就能在大多數(shù)SQL和PL/SQL語(yǔ)句和函數(shù)中使用LOB類型了。要讀、寫(xiě)和分段的操作LOB,我們可以使用Oracle系統(tǒng)包DBMS_LOB。BFILE BFILE數(shù)據(jù)類型用于存儲(chǔ)二進(jìn)制對(duì)象,它將存儲(chǔ)的內(nèi)容放到操作系統(tǒng)的文件中,而不是數(shù)據(jù)庫(kù)內(nèi)。每個(gè)BFILE變量都存儲(chǔ)一個(gè)文件定位器,它指向服務(wù)器上的一個(gè)大的二進(jìn)制文件。定位器包含目錄別名,該別名給出了文件全路徑。BFILE類型是只讀的,而且它的大小要依賴于系統(tǒng),不能超過(guò)4G。我們的DBA要確保給定的BFILE存在且Oracle有讀取它的權(quán)限。BFILE并不參與事務(wù),是不可恢復(fù),不能被復(fù)制。能夠被打開(kāi)的BFILE最大數(shù)是由Oracle初始化參

36、數(shù)SESSION_MAX_OPEN_FILES決定的。 BLOB、CLOB和NCLOB BLOB數(shù)據(jù)類型可以在數(shù)據(jù)庫(kù)中存放不超過(guò)4G的大型二進(jìn)制對(duì)象;CLOB和NCLOB可以在數(shù)據(jù)庫(kù)中分別存儲(chǔ)大塊CHAR類型和NCHAR類型的字符數(shù)據(jù),都支持定寬和變寬字符集。同BFILE一樣,這三個(gè)類型也都儲(chǔ)存定位器,指向各自類型的一個(gè)大數(shù)據(jù)塊。數(shù)據(jù)大小都不能超過(guò)4G。BLOB、CLOB和NCLOB都可以在事務(wù)中使用,能夠被恢復(fù)和復(fù)制。DBMS_LOB包可以對(duì)它們更改過(guò)的內(nèi)容進(jìn)行提交或回滾操作。BLOB、CLOB和NCLOB的定位器都可以跨事務(wù)使用,但不能跨會(huì)話使用。 布爾類型布爾類型能存儲(chǔ)邏輯值TRUE、F

37、ALSE和NULL(NULL代表缺失、未知或不可用的值)。只有邏輯操作符才允許應(yīng)用在布爾變量上。數(shù)據(jù)庫(kù)SQL類型并不支持布爾類型,只有PL/SQL才支持。所以就不能往數(shù)據(jù)庫(kù)中插入或從數(shù)據(jù)庫(kù)中檢索出布爾類型的值。 Datetime和Interval類型Datetime就是日期時(shí)間類型,而Interval指的是時(shí)間的間隔。Datetime和Interval類型都由幾個(gè)域組成,下表是對(duì)每個(gè)域及其它們對(duì)應(yīng)的有效值描述: 域名稱 有效日期時(shí)間值 有效間隔值 YEAR -4712 到 9999 (不包括0) 任意非零整數(shù) MONTH 01 到 12 0 到 11 DAY 01 到 31 (根據(jù)當(dāng)?shù)氐臍v法規(guī)

38、則,受MONTH和YEAR值的限制 任意非零整數(shù) HOUR 00 到 23 0 到 23 MINUTE 00 到 59 0 到 59 SECOND 00 到 59.9(n),9(n)是秒小數(shù)部分的精度 0 to 59.9(n),9(n)間隔秒的小數(shù)部分的精度 TIMEZONE_HOUR -12 到 14 (隨日光節(jié)約時(shí)間的變化而變化) 不可用 TIMEZONE_MINUTE 00 到 59 不可用 TIMEZONE_REGION 查看視圖V$TIMEZONE_NAMES 不可用 TIMEZONE_ABBR 查看視圖V$TIMEZONE_NAMES 不可用 除了TIMESTAMP WITH LO

39、CAL TIMEZONE以外,剩下的都是SQL92所支持的。 DATE DATE數(shù)據(jù)類型能夠存儲(chǔ)定長(zhǎng)的日期時(shí)間。日期部分默認(rèn)為當(dāng)月的第一天;時(shí)間部分為午夜時(shí)間。函數(shù)SYSDATE能夠返回當(dāng)前的日期和時(shí)間。 提示:如果只進(jìn)行日期的等值比較,忽略時(shí)間部分,可以使用函數(shù)TRUNC(date_variable)。 有效的日期范圍是從公元前4721年1月1日到公元9999年12月31日。儒略日(Julian date)是自公元前4712年1月1日起經(jīng)過(guò)的天數(shù)。我們可以使用日期模式J配合函數(shù)TO_DATE和TO_CHAR來(lái)把日期值轉(zhuǎn)換成等值的儒略日。在日期表達(dá)式中PL/SQL會(huì)自動(dòng)地將格式為默認(rèn)日期格式的

40、字符值轉(zhuǎn)成DATE類型值。默認(rèn)的日期格式由Oracle的初始化參數(shù)NLS_DATE_FORMAT決定的。例如,默認(rèn)格式可能是DD-MON-YY,它包含兩位數(shù)字表示一個(gè)月中的第幾日,月份名稱的縮寫(xiě)和兩位記年用的數(shù)字。我們可以對(duì)日期進(jìn)行加減運(yùn)算。例如,下面的語(yǔ)句就能返回員工自被雇用日起,至今所經(jīng)過(guò)的天數(shù):SELECT SYSDATE - hiredate INTO days_worked FROM emp WHERE empno = 7499; 在算術(shù)表達(dá)式中,PL/SQL會(huì)將整數(shù)文字當(dāng)作日來(lái)處理,如SYSDATE + 1就代表明天的時(shí)間。TIMESTAMP TIMESTAMP是對(duì)DATE的擴(kuò)展,

41、包含了年月日時(shí)分秒,語(yǔ)法如下: TIMESTAMP(precision) precision是可選參數(shù),用于指定秒的小數(shù)部分?jǐn)?shù)字個(gè)數(shù)。參數(shù)precision不可以是常量或變量,其有效范圍是0到9,默認(rèn)值是6。默認(rèn)的時(shí)間戳(timestamp)格式是由Oracle初始化參數(shù)NLS_TIMESTAMP_FORMAT決定的。 在下面的例子中,我們聲明了一個(gè)TIMESTAMP類型的變量,然后為它賦值:DECLARE checkout TIMESTAMP ( 3 );BEGIN checkout := 1999-06-22 07:48:53.275; .END; 這個(gè)例子中,秒的小數(shù)部分是0.275。T

42、IMESTAMP WITH TIME ZONE TIMESTAMP WITH TIME ZONE擴(kuò)展了TIMESTAMP,能夠表現(xiàn)時(shí)區(qū)位移(time-zone displacement)。時(shí)區(qū)位移在本地時(shí)間和通用協(xié)調(diào)時(shí)間(UTC)中是不同的。語(yǔ)法如下: TIMESTAMP(precision) WITH TIME ZONE precision的用法同TIMESTAMP語(yǔ)法中的precision。默認(rèn)格式由Oracle初始化參數(shù)NLS_TIMESTAMP_TZ_FORMAT決定。下例中,我們聲明一個(gè)TIMESTAMP WITH TIME ZONE類型的變量,然后為其賦值: DECLARE LOG

43、OFF TIMESTAMP ( 3 ) WITH TIME ZONE;BEGIN LOGOFF := 1999-10-31 09:42:37.114 +02:00; .END; 例子中時(shí)區(qū)位移是+02:00。我們還可以使用符號(hào)名稱(symbolic name)來(lái)指定時(shí)區(qū)位移,名稱可以是完整形式也可以是縮寫(xiě)形式,如US/Pacific和PDT,或是組合的形式。例如,下面的文字全都表現(xiàn)同一時(shí)間。第三種形式最可靠,因?yàn)樗付饲袚Q到日光節(jié)約時(shí)間時(shí)的規(guī)則。TIMESTAMP 1999-04-15 8:00:00 -8:00TIMESTAMP 1999-04-15 8:00:00 US/PacificT

44、IMESTAMP 1999-10-31 01:30:00 US/Pacific PDT 我們可以在數(shù)據(jù)詞典V$TIMEZONE_NAMES的TIMEZONE_REGION和TIMEZONE_ABBR字段中找到相應(yīng)的時(shí)區(qū)名稱和它的縮寫(xiě)。如果兩個(gè)TIMESTAMP WITH TIME ZONE值在通用協(xié)調(diào)時(shí)間中的值一樣,那么系統(tǒng)就會(huì)認(rèn)為它們的值相同而忽略它們的時(shí)區(qū)位移。下例兩個(gè)值被認(rèn)為是相同的,因?yàn)樵谕ㄓ脜f(xié)調(diào)時(shí)間里,太平洋標(biāo)準(zhǔn)時(shí)間8:00 AM和(美國(guó))東部時(shí)區(qū)11:00 AM是相同的:1999-08-29 08:00:00 -8:001999-08-29 11:00:00 -5:00 TIMES

45、TAMP WITH LOCAL TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE是對(duì)TIMESTAMP WITH TIME ZONE的擴(kuò)展,它的語(yǔ)法如下: TIMESTAMP(precision) WITH LOCAL TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE的用途和TIMESTAMP WITH TIME ZONE相似,它們不同之處在于,當(dāng)我們往數(shù)據(jù)庫(kù)中插入TIMESTAMP WITH LOCAL TIME ZONE類型數(shù)據(jù)的時(shí)候,數(shù)據(jù)會(huì)被轉(zhuǎn)成數(shù)據(jù)庫(kù)的時(shí)區(qū),并且時(shí)區(qū)位移并不會(huì)存放在數(shù)據(jù)庫(kù)中。當(dāng)進(jìn)行數(shù)據(jù)檢索時(shí),Oracle會(huì)

46、按我們本地會(huì)話的時(shí)區(qū)設(shè)置返回值。下面就是一個(gè)使用TIMESTAMP WITH LOCAL TIME ZONE的例子: DECLARE LOGOFF TIMESTAMP ( 3 ) WITH LOCAL TIME ZONE;BEGIN NULL; .END; 我們不可以用文字值為這種類型的變量賦值。INTERVAL YEAR TO MONTH 我們可以使用INTERVAL YEAR TO MONTH類型用來(lái)保存年月的間隔,語(yǔ)法如下: INTERVAL YEAR(precision) TO MONTH precision指定間隔的年數(shù)。參數(shù)precision不能是常量或變量,其范圍在1到4之間,默

47、認(rèn)值是2,下面的例子中聲明了一個(gè)INTERVAL YEAR TO MONTH類型的變量,并把間隔值101年3個(gè)月賦給它:DECLARE lifetime INTERVAL YEAR(3)TO MONTH;BEGIN lifetime := INTERVAL 101-3 YEAR TO MONTH; - interval literal lifetime := 101-3; - implicit conversion from character type lifetime := INTERVAL 101 YEAR; - Can specify just the years lifetime :

48、= INTERVAL 3 MONTH; - Can specify just the months .END; INTERVAL DAY TO SECOND 我們可以使用INTERVAL DAY TO SECOND數(shù)據(jù)類型存儲(chǔ)和操作天、小時(shí)、分鐘和秒,語(yǔ)法如下:INTERVAL DAY(leading_precision) TO SECOND(fractional_seconds_precision) leading_precision和fractional_seconds_precision分別指定了天數(shù)和秒數(shù)。這兩個(gè)值都不可以用常量或變量指定,且只能使用范圍在0到9之間的整數(shù)文字為其賦值。

49、它們的默認(rèn)值分別為2和6。下面的例子中,我們聲明了一個(gè)INTERVAL DAY TO SECOND類型的變量: DECLARE lag_time INTERVAL DAY(3)TO SECOND(3);BEGIN IF lag_time INTERVAL 6 DAY THEN . .END; 用戶自定義子類型暫時(shí)不考慮.基本函數(shù).1.字符函數(shù)ASCII返回與指定的字符對(duì)應(yīng)的十進(jìn)制數(shù);SQL select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual;A A ZERO SPACE- - - -65 97 48 322.C

50、HR給出整數(shù),返回對(duì)應(yīng)的字符;SQL select chr(54740) zhao,chr(65) chr65 from dual; ZH C- -趙 A3.CONCAT連接兩個(gè)字符串;SQL select concat(010-,88888888)|轉(zhuǎn)23 高乾競(jìng)電話 from dual;高乾競(jìng)電話234.INITCAP返回字符串并將字符串的第一個(gè)字母變?yōu)榇髮?xiě);SQL select initcap(smith) upp from dual;UPP-Smith5.INSTR(C1,C2,I,J)在一個(gè)字符串中搜索指定的字符,返回發(fā)現(xiàn)指定的字符的位置;C1 被搜索的字

51、符串C2 希望搜索的字符串I 搜索的開(kāi)始位置,默認(rèn)為1J 出現(xiàn)的位置,默認(rèn)為1SQL select instr(oracle traning,ra,1,2) instring from dual;INSTRING-96.LENGTH返回字符串的長(zhǎng)度;SQL select name,length(name),addr,length(addr),sal,length(to_char(sal) from .nchar_tst;NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)- - - - - -高乾競(jìng) 3 北京市海錠區(qū) 6 999

52、9.99 7 7.LOWER返回字符串,并將所有的字符小寫(xiě)SQL select lower(AaBbCcDd)AaBbCcDd from dual;AABBCCDD-aabbccdd8.UPPER返回字符串,并將所有的字符大寫(xiě)SQL select upper(AaBbCcDd) upper from dual;UPPER-AABBCCDD 9.RPAD和LPAD(粘貼字符)RPAD 在列的右邊粘貼字符LPAD 在列的左邊粘貼字符SQL select lpad(rpad(gao,10,*),17,*)from dual;LPAD(RPAD(GAO,1-*gao*不夠字符則用*來(lái)填滿10.LTRI

53、M和RTRIMLTRIM 刪除左邊出現(xiàn)的字符串RTRIM 刪除右邊出現(xiàn)的字符串SQL select ltrim(rtrim( gao qian jing , ), ) from dual;LTRIM(RTRIM(-gao qian jing11.SUBSTR(string,start,count)取子字符串,從start開(kāi)始,取count個(gè)SUBSTR(-0888888812.REPLACE(string,s1,s2)string 希望被替換的字符或變量 s1 被替換的字符串s2 要替換的字符串SQL select replace(he love you,he,i) from dual;REP

54、LACE(HELOVEYOU,HE,I)-i love you13.SOUNDEX返回一個(gè)與給定的字符串讀音相同的字符串SQL create table table1(xm varchar(8);SQL insert into table1 values(weather);SQL insert into table1 values(wether);SQL insert into table1 values(gao);SQL select xm from table1 where soundex(xm)=soundex(weather);XM-weatherwether14.TRIM(s fro

55、m string)LEADING 剪掉前面的字符TRAILING 剪掉后面的字符如果不指定,默認(rèn)為空格符.2.日期型函數(shù)常用的時(shí)間格式掩碼如下:掩碼元素 含義YYYY 四位數(shù)年份 (如:2005) yearYY 二位數(shù)年份(如 05) Q 季度(1-4) MM 月份(01-12) monthWW 年的星期數(shù)(1-53),其中第一星期為年的第一天至第七天 W 月的星期數(shù)(1-5),其中第一星期為月的第一天至第七天 DDD 年的日(1-366) DD 月的日(1-31) D 周的日(1-7),其中周日為1,周六為7 dayHH24 24小時(shí)制(0-23) hourMI 分鐘(0-59) minut

56、eSS 秒(0-59) secondSSSSS 自午夜之后的秒(0-86399)日期時(shí)間函數(shù):add_months(日期,number) 指定日期推遲number個(gè)月last_day(日期) 指定日期當(dāng)月的最后一天new_time(日期,時(shí)區(qū)簡(jiǎn)寫(xiě)) 調(diào)整時(shí)區(qū)next_day(日期,number) number表示周幾,星期日是1,指定number的日期(一周內(nèi)或一周后)months_between(日期1,日期2) 日期1和日期2之間有幾個(gè)月sysdate 系統(tǒng)當(dāng)期那日期和時(shí)間to_char.3. 其他函數(shù)NvlDecode.過(guò)程控制.1.分支語(yǔ)句:IF condition THENSeque

57、nce_of_statements;END IF;IF condition THENSequence_of_statement1;ELSESequence_of_statement2;END IF;IF condition1 THENSequence_of_statement1;ELSIF condition2 THENSequence_of_statement2;ELSIF condition3 THENSequence_of_statement3;END IF;.2.循環(huán)語(yǔ)句:LOOPSequence_of_statements;IF condition THENEXIT;END IF;E

58、ND LOOP; WHILE condition LOOPSequence_of_statements; I = i+1END LOOP;FOR counter IN lower_bound.higher_bound LOOPSequence_of_statements;END LOOP;.表連接.1.迪卡爾乘積連接條件被省略連接條件無(wú)效第一個(gè)表中的所有行與第二個(gè)表中的所有行連接.2.等值連接.3.非等值連接.4.外連接group by什么是分組函數(shù)分組函數(shù)可以對(duì)行集進(jìn)行操作,并且為每組給出一個(gè)結(jié)果分組函數(shù)基本語(yǔ)法 SELECT column, group_function(column),

59、. FROM table WHERE condition GROUP BY column HAVING . ORDER BY column;常用分組函數(shù)AVGCOUNTMAXMINSTDDEVSUMVARIANCE.DDL與DML、DCL及動(dòng)態(tài)SQL本節(jié)重點(diǎn)掌握如下內(nèi)容DDLDMLDCL語(yǔ)言的功用以及區(qū)別什么時(shí)間使用動(dòng)態(tài)SQL,動(dòng)態(tài)SQL語(yǔ)法.1.DDL DML DCL關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言分為三類DDL數(shù)據(jù)描述語(yǔ)言,包括create drop alter truncateTruncate table wangjie1;Drop table wangjie1create table test_wang

60、jie1 (v varchar2(1000),v1 varchar2(1000); alter table test_wangjie1 add (v3 varchar2(1000);alter table test_wangjie1 drop column v3;DML數(shù)據(jù)操作語(yǔ)言,包括select insert delete updateDCL數(shù)據(jù)控制語(yǔ)言,包括grant revoke.動(dòng)態(tài)SQLOracle編譯PL/SQL程序塊分為兩種:其一為前期聯(lián)編(early binding),即SQL語(yǔ)句在程序編譯期間就已經(jīng)確定,大多數(shù)的編譯情況屬于這種類型;另外一種是后期聯(lián)編(late bindi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論