一、概述
在ORACLE8中定義了:標(biāo)量(SCALAR)、復(fù)合(COMPOSITE)、引用(REFERENCE)和LOB四種數(shù)據(jù)類型,下面詳細(xì)介紹它們的特性。
二、標(biāo)量(SCALAR)
合法的標(biāo)量類型與數(shù)據(jù)庫的列所使用的類型相同,此外它還有一些擴(kuò)展。它又分為七個組:數(shù)字、字符、行、日期、行標(biāo)識、布爾和可信。
數(shù)字 ,它有三種基本類型--NUMBER、PLS_INTEGER和BINARY_INTENER。NUMBER可以描述整數(shù)或?qū)崝?shù),而PLS_INTEGER和BINARY_INTENER只能描述整數(shù)。
NUMBER ,是以十進(jìn)制格式進(jìn)行 存儲 的,它便于 存儲 ,但是在計算上,系統(tǒng)會自動的將它轉(zhuǎn)換成為二進(jìn)制進(jìn)行運(yùn)算的。它的定義方式是NUMBER(P,S),P是精度,最大38位,S是刻度范圍,可在-84...127間取值。例如:NUMBER(5,2)可以用來存儲表示-999.99...999.99間的數(shù)值。P、S可以在定義是省略,例如:NUMBER(5)、NUMBER等;
BINARY_INTENER 用來描述不存儲在數(shù)據(jù)庫中,但是需要用來計算的帶符號的整數(shù)值。它以2的補(bǔ)碼二進(jìn)制形式表述。循環(huán)計數(shù)器經(jīng)常使用這種類型。
PLS_INTEGER和BINARY_INTENER 唯一區(qū)別是在計算當(dāng)中發(fā)生溢出時,BINARY_INTENER型的變量會被自動指派給一個NUMBER型而不會出錯,PLS_INTEGER型的變量將會發(fā)生錯誤。
字符 ,包括CHAR、VARCHAR2(VARCHAR)、LONG、NCHAR和NVARCHAR2幾種類型。
CHAR ,描述定長的字符串,如果實(shí)際值不夠定義的長度,系統(tǒng)將以空格填充。它的聲明方式如下CHAR(L),L為字符串長度,缺省為1,作為變量最大32767個字符,作為數(shù)據(jù)存儲在ORACLE8中最大為2000。
VARCHAR2 (VARCHAR),描述變長字符串。它的聲明方式如下VARCHAR2(L),L為字符串長度,沒有缺省值,作為變量最大32767個字節(jié),作為數(shù)據(jù)存儲在ORACLE8中最大為4000。在多字節(jié)語言環(huán)境中,實(shí)際存儲的字符個數(shù)可能小于L值,例如:當(dāng)語言環(huán)境為中文(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)時,一個VARCHAR2(200)的數(shù)據(jù)列可以保存200個英文字符或者100個漢字字符。
LONG ,在數(shù)據(jù)庫存儲中可以用來保存高達(dá)2G的數(shù)據(jù),作為變量,可以表示一個最大長度為32760字節(jié)的可變字符串。
NCHAR、NVARCHAR2 ,國家字符集,與環(huán)境變量NLS指定的語言集密切相關(guān),使用方法和CHAR、VARCHAR2相同。
行 ,包括RAW和LONG RAW兩種類型。用來存儲二進(jìn)制數(shù)據(jù),不會在字符集間轉(zhuǎn)換。
RAW ,類似于CHAR,聲明方式RAW(L),L為長度,以字節(jié)為單位,作為數(shù)據(jù)庫列最大2000,作為變量最大32767字節(jié)。
LONG RAW ,類似于LONG,作為數(shù)據(jù)庫列最大存儲2G字節(jié)的數(shù)據(jù),作為變量最大32760字節(jié)。
日期 ,只有一種類型--DATE,用來存儲時間信息,站用7個字節(jié)(從世紀(jì)到秒),絕對沒有“千年蟲”問題。
行標(biāo)識 ,只有一種類型--ROWID,用來存儲“行標(biāo)識符”,可以利用ROWIDTOCHAR函數(shù)來將行標(biāo)識轉(zhuǎn)換成為字符。
布爾 ,只有一種類型--BOOLEAN,僅僅可以表示TRUE、FALSE或者NULL。
可信 ,只有一種類型--MLSLABEL,可以在TRUSTED ORACLE中用來保存可變長度的二進(jìn)制標(biāo)簽。在標(biāo)準(zhǔn)ORACLE中,只能存儲NULL值。
三、復(fù)合(COMPOSITE)?
標(biāo)量類型是經(jīng)過預(yù)定義的,利用這些類型可以衍生出一些復(fù)合類型。主要有記錄、表。
記錄,可以看作是一組標(biāo)量的組合結(jié)構(gòu),它的聲明方式如下:
TYPE record_type_name IS RECORD?
( filed1 type1 [NOT NULL] [:=expr1]
.......
filedn typen [NOT NULL] [:=exprn] )
其中,record_type_name是記錄類型的名字。(是不是看著象CREATE TABLE?......)引用時必須定義相關(guān)的變量,記錄只是TYPE,不是VARIABLE。
表,不是物理存儲數(shù)據(jù)的表,在這里是一種變量類型,也稱為PL/SQL表,它類似于C語言中的數(shù)組,在處理方式上也相似。它的聲明方式如下:
TYPE table_type_name IS TABLE OF scalar_type INDEX BY BINARY_INTENER;
其中,table_type_name是類型的名字,scalar_type是一種標(biāo)量類型的類型聲明。引用時也必須定義相關(guān)的變量。表和數(shù)組不同,表有兩列,KEY和VALUE,KEY就是定義時聲明的BINARY_INTENER,VALUE就是定義時聲明的scalar_type。
除了記錄和表之外,還有對象類型、集合(嵌套表和VARRAYS)等類型,這些將專門講解。
四、引用(REFERENCE)
在PL/SQL8.0之前,只有一種類型--REF CURSOR,也就是游標(biāo)。它的定義較為簡單,
CURSOR cursor_name IS select .....from.....;
在PL/SQL8.0之后,引入了REF類型,它指向一個對象。這種類型將單獨(dú)講解。(等我弄明白再說,免得在高人面前......)
五、LOB型
LOB變量主要是用來存儲大量數(shù)據(jù)的數(shù)據(jù)庫字段,最大可以存儲4G字節(jié)的內(nèi)容(這么大,存VCD?,浪費(fèi)!)。主要有:?
CLOB :和ORACLE7中的LONG類型相似,存儲單字節(jié)字符數(shù)據(jù)。(別用來存中文喔。。。)?
NCLOB :用來存儲定寬多字節(jié)字符數(shù)據(jù)。(例如:存《嘯傲江湖》就挺好)?
BLOB :和LONG RAW相似,用來存儲無結(jié)構(gòu)的二進(jìn)制數(shù)據(jù)。?
BFILE :它用來允許ORACLE對數(shù)據(jù)庫外存儲的大型二進(jìn)制文本進(jìn)行只讀形式的訪問。?
六、其他
其實(shí)在完成對標(biāo)量變量的理解之后,基本上可以應(yīng)付C/S模式下的常規(guī)數(shù)據(jù)庫應(yīng)用所需了,后續(xù)的類型說實(shí)話,我玩了5年ORACLE,都很少用到。
附:參考書《ORACLE8 PL/SQL程序設(shè)計》(《ORACLE8 PL/SQL PROGRAMMING》) ORACLE技術(shù)系列叢書 機(jī)械工業(yè)出版社
注:本文所列舉的是PL/SQL當(dāng)中可以定義的數(shù)據(jù)類型,并不是所有的類型都可以在建表時指定為列的數(shù)據(jù)類型?
在ORACLE8中定義了:標(biāo)量(SCALAR)、復(fù)合(COMPOSITE)、引用(REFERENCE)和LOB四種數(shù)據(jù)類型,下面詳細(xì)介紹它們的特性。
二、標(biāo)量(SCALAR)
合法的標(biāo)量類型與數(shù)據(jù)庫的列所使用的類型相同,此外它還有一些擴(kuò)展。它又分為七個組:數(shù)字、字符、行、日期、行標(biāo)識、布爾和可信。
數(shù)字 ,它有三種基本類型--NUMBER、PLS_INTEGER和BINARY_INTENER。NUMBER可以描述整數(shù)或?qū)崝?shù),而PLS_INTEGER和BINARY_INTENER只能描述整數(shù)。
NUMBER ,是以十進(jìn)制格式進(jìn)行 存儲 的,它便于 存儲 ,但是在計算上,系統(tǒng)會自動的將它轉(zhuǎn)換成為二進(jìn)制進(jìn)行運(yùn)算的。它的定義方式是NUMBER(P,S),P是精度,最大38位,S是刻度范圍,可在-84...127間取值。例如:NUMBER(5,2)可以用來存儲表示-999.99...999.99間的數(shù)值。P、S可以在定義是省略,例如:NUMBER(5)、NUMBER等;
BINARY_INTENER 用來描述不存儲在數(shù)據(jù)庫中,但是需要用來計算的帶符號的整數(shù)值。它以2的補(bǔ)碼二進(jìn)制形式表述。循環(huán)計數(shù)器經(jīng)常使用這種類型。
PLS_INTEGER和BINARY_INTENER 唯一區(qū)別是在計算當(dāng)中發(fā)生溢出時,BINARY_INTENER型的變量會被自動指派給一個NUMBER型而不會出錯,PLS_INTEGER型的變量將會發(fā)生錯誤。
字符 ,包括CHAR、VARCHAR2(VARCHAR)、LONG、NCHAR和NVARCHAR2幾種類型。
CHAR ,描述定長的字符串,如果實(shí)際值不夠定義的長度,系統(tǒng)將以空格填充。它的聲明方式如下CHAR(L),L為字符串長度,缺省為1,作為變量最大32767個字符,作為數(shù)據(jù)存儲在ORACLE8中最大為2000。
VARCHAR2 (VARCHAR),描述變長字符串。它的聲明方式如下VARCHAR2(L),L為字符串長度,沒有缺省值,作為變量最大32767個字節(jié),作為數(shù)據(jù)存儲在ORACLE8中最大為4000。在多字節(jié)語言環(huán)境中,實(shí)際存儲的字符個數(shù)可能小于L值,例如:當(dāng)語言環(huán)境為中文(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)時,一個VARCHAR2(200)的數(shù)據(jù)列可以保存200個英文字符或者100個漢字字符。
LONG ,在數(shù)據(jù)庫存儲中可以用來保存高達(dá)2G的數(shù)據(jù),作為變量,可以表示一個最大長度為32760字節(jié)的可變字符串。
NCHAR、NVARCHAR2 ,國家字符集,與環(huán)境變量NLS指定的語言集密切相關(guān),使用方法和CHAR、VARCHAR2相同。
行 ,包括RAW和LONG RAW兩種類型。用來存儲二進(jìn)制數(shù)據(jù),不會在字符集間轉(zhuǎn)換。
RAW ,類似于CHAR,聲明方式RAW(L),L為長度,以字節(jié)為單位,作為數(shù)據(jù)庫列最大2000,作為變量最大32767字節(jié)。
LONG RAW ,類似于LONG,作為數(shù)據(jù)庫列最大存儲2G字節(jié)的數(shù)據(jù),作為變量最大32760字節(jié)。
日期 ,只有一種類型--DATE,用來存儲時間信息,站用7個字節(jié)(從世紀(jì)到秒),絕對沒有“千年蟲”問題。
行標(biāo)識 ,只有一種類型--ROWID,用來存儲“行標(biāo)識符”,可以利用ROWIDTOCHAR函數(shù)來將行標(biāo)識轉(zhuǎn)換成為字符。
布爾 ,只有一種類型--BOOLEAN,僅僅可以表示TRUE、FALSE或者NULL。
可信 ,只有一種類型--MLSLABEL,可以在TRUSTED ORACLE中用來保存可變長度的二進(jìn)制標(biāo)簽。在標(biāo)準(zhǔn)ORACLE中,只能存儲NULL值。
三、復(fù)合(COMPOSITE)?
標(biāo)量類型是經(jīng)過預(yù)定義的,利用這些類型可以衍生出一些復(fù)合類型。主要有記錄、表。
記錄,可以看作是一組標(biāo)量的組合結(jié)構(gòu),它的聲明方式如下:
TYPE record_type_name IS RECORD?
( filed1 type1 [NOT NULL] [:=expr1]
.......
filedn typen [NOT NULL] [:=exprn] )
其中,record_type_name是記錄類型的名字。(是不是看著象CREATE TABLE?......)引用時必須定義相關(guān)的變量,記錄只是TYPE,不是VARIABLE。
表,不是物理存儲數(shù)據(jù)的表,在這里是一種變量類型,也稱為PL/SQL表,它類似于C語言中的數(shù)組,在處理方式上也相似。它的聲明方式如下:
TYPE table_type_name IS TABLE OF scalar_type INDEX BY BINARY_INTENER;
其中,table_type_name是類型的名字,scalar_type是一種標(biāo)量類型的類型聲明。引用時也必須定義相關(guān)的變量。表和數(shù)組不同,表有兩列,KEY和VALUE,KEY就是定義時聲明的BINARY_INTENER,VALUE就是定義時聲明的scalar_type。
除了記錄和表之外,還有對象類型、集合(嵌套表和VARRAYS)等類型,這些將專門講解。
四、引用(REFERENCE)
在PL/SQL8.0之前,只有一種類型--REF CURSOR,也就是游標(biāo)。它的定義較為簡單,
CURSOR cursor_name IS select .....from.....;
在PL/SQL8.0之后,引入了REF類型,它指向一個對象。這種類型將單獨(dú)講解。(等我弄明白再說,免得在高人面前......)
五、LOB型
LOB變量主要是用來存儲大量數(shù)據(jù)的數(shù)據(jù)庫字段,最大可以存儲4G字節(jié)的內(nèi)容(這么大,存VCD?,浪費(fèi)!)。主要有:?
CLOB :和ORACLE7中的LONG類型相似,存儲單字節(jié)字符數(shù)據(jù)。(別用來存中文喔。。。)?
NCLOB :用來存儲定寬多字節(jié)字符數(shù)據(jù)。(例如:存《嘯傲江湖》就挺好)?
BLOB :和LONG RAW相似,用來存儲無結(jié)構(gòu)的二進(jìn)制數(shù)據(jù)。?
BFILE :它用來允許ORACLE對數(shù)據(jù)庫外存儲的大型二進(jìn)制文本進(jìn)行只讀形式的訪問。?
六、其他
其實(shí)在完成對標(biāo)量變量的理解之后,基本上可以應(yīng)付C/S模式下的常規(guī)數(shù)據(jù)庫應(yīng)用所需了,后續(xù)的類型說實(shí)話,我玩了5年ORACLE,都很少用到。
附:參考書《ORACLE8 PL/SQL程序設(shè)計》(《ORACLE8 PL/SQL PROGRAMMING》) ORACLE技術(shù)系列叢書 機(jī)械工業(yè)出版社
注:本文所列舉的是PL/SQL當(dāng)中可以定義的數(shù)據(jù)類型,并不是所有的類型都可以在建表時指定為列的數(shù)據(jù)類型?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
