定義部分主要定義變量和常量,語法如下:
DECLARE
virableName [CONSTANT] dataType [NOT NULL][:=|default exp or value];
在給變量或者常量命名時應該遵循以下原則:
1、變量名只能字母開頭,其它位可以包含_、$、#和數字
2、長度1-30
3、不區分大小寫
4、不能是系統關鍵字
CONSTANT關鍵字表示定義常量,常量定義時必須給出初始值,而且值不能再更改。
dataType處是數據類型,要注意此處的數據類型是PL/SQL數據類型,並非定義表使用的SQL數據類型。
NOT NULL 表示變量或者常量不允許為NULL,而且在定義時就必須提供非NULL初始值。
以下代碼代碼定義了變量和常量:
DECLARE
credit_limit CONSTANT NUMBER :=5000;--常量
invalid BOOLEAN := FALSE;--布爾類型變量
acct_id INTEGER(4) NOT NULL default 9999;--必須附初值的變量
pi CONSTANT REAL := 3.14159;--浮點數常量
postal_code VARCHAR2(20);--與VARCHAR2(20 BYTE)同義
last_name VARCHAR2(20 CHAR);--變量
my_ename emp.ename%TYPE;--與emp表的ename列數據類型相同
PL/SQL數據類型分為四種,標量類型、復合類型、參照類型和LOB類型。
一、標量類型
標量類型的含義是存放單個值。標量類型中又分為整形、數字、字符、日期和布爾等類型。
1、BINARY_INTEGER
范圍是從-231--231的整數,如果將浮點數賦值給該類型,浮點數將四捨五入成整數再賦值給該類型。另外該類型還有下列幾個子類型:
NATURAL 0-231范圍的整數
POSITIVE 1-231范圍的整數
NATURALN 不允許NULL值,其它同NATURAL
POSITIVEN 不允許NULL值,其它同POSITIVE
SIGNTYPE 符號類型,只允許三個值-1 0 1三個值
注意:BINARY_INTEGER及其子類型是PL/SQL數據類型,而非SQL數據類型,也就是說,在創建表時不能使用。
2、PLS_INTEGER
范圍是從-231--231的整數,雖然PLS_INTEGER與BINARY_INTEGER范圍一致,但是它們不完全相同。如果PLS_INTEGER計算時數據溢出,它會拋出異常。而BINARY_INTEGER會自動轉換成NUMBER類型,另外PLS_INTEGER的速度要比BINARY_INTEGER快。
注意:PLS_INTEGER是PL/SQL數據類型,而非SQL數據類型。
3、NUMBER
表示固定長度的數字或者浮點數,范圍從1E-130--10E125,NUMBER(p,s),其中p范圍是1至38,s范圍是-84至127。p和s都只能是數字,不能是常量或者變量。下面分成幾種情況討論:
38>=p>=s>=0
a NUMBER(5,3)表示最多為5(p)位,且含3(s)位小數的數字。
b NUMBER(5,5)表示含5位小數的浮點數。
以上注意:如果小數位大於s,則四捨五入到s位。如果整數位大於p-s,Oracle則會報錯。如:
a:=84.987;(合法)
a:=84.98765;(合法,但值變為84.988)
a:=845.987;(Oracle報錯:數值精度太高)
b:=0.98765;(合法,小數點左邊的零不算有效位)
b:=0.987654;(合法,但值變為.98765)
b:=1.9876;(Oracle報錯,數值精度太高)
127>=s>p
c NUMBER(4,5)表示小數點右側至少含有1(s-p)個0,小數總位數不超過5(s,如果大於s則四捨五入),整數部分位0
c:=1;(Oracle報錯:數值精度太高)
c:=0.1;(Oracle報錯:數值精度太高)
c:=0.01;(合法)
c:=0.001;(合法)
c:=0.0001;(合法)
c:=0.00001;(合法)
c:=0.000001;(合法,但值被四捨五入成0)
s<0
d NUMBER(5,-2)表示從小數點左邊2位進行四捨五入,總位數p+|s|
d:=12345;(合法,但值變為12300)
d:=123456;(合法,但值變為123500)
d:=1234567;(合法,但值變為1234600)
d:=12345678;(Oracle報錯:數值精度太高)
NUMBER(p)與NUMBER(p,0)等價 表示最多為p位的整數
NUMBER 如果p和s都沒有指定,這時NUMBER表示浮點數。
另外為了能和ANSI/ISO和IBM類型兼容或是想使用一個更加有描述性意義的名字,我們可以使用NUMBER類型的幾個子類型:
DEC 固定位數的最大精度為38位的定點數
DECIMAL 固定位數的最大精度為38位的定點數
NUMERIC 固定位數的最大精度為38位的定點數
DOUBLE PRECISION 126字節的浮點數,大約相當於38位的浮點數
FLOAT 126字節的浮點數,大約相當於38位的浮點數
REAL 63字節的浮點數,大約相當於18位的浮點數
INTEGER
可以聲明最大精度為38位十進制數字的整數
INT
可以聲明最大精度為38位十進制數字的整數
SMALLINT
可以聲明最大精度為38位十進制數字的整數
注意:NUMBER及其子類型是PL/SQL數據類型,也是SQL數據類型。
4、CHAR(CHARACTER)
表示固定位數的字符數據,能存儲什麼字符取決於數據庫的字符集,如果數據庫字符集采用的是簡體中文字符集,那麼CHAR類型可以存儲漢字 字母和數字字符等。語法如下:
CHAR[(size [CHAR | BYTE] )]
CHAR類型有兩個可選參數,CHAR和BYTE,默認為BYTE。
在CHAR(size BYTE)定義中,size最大值為32767,表示此數據類型最大占用32767個字節。
在CHAR(size CHAR)定義中,size最大值也為32767,上限大小仍舊是32767字節,也就是說此數據類型不一定能夠存儲32767個字符。比如用此數據類型存儲漢字,最多能存儲16383個漢字。對於雙字節和多字節的字符集,我們可以使用字節最大長度的一半或三分之一作為最大字符個數。CHAR的子類型CHARACTER和CHAR有著相同的取值范圍。CHARACTER只是CHAR的一個別名。這個子類型能與ANSI/ISO和IBM類型相兼容。
注意:CHAR既是PL/SQL數據類型,也是SQL數據類型,但在SQL中size的最大值為2000字節。
a CHAR 默認位1byte
a:='s';(合法)
a:='中';(Orcal報錯:數字或值錯誤 : 字符串緩沖區太小)
b CHAR(1 char)
b:='s';(合法)
b:='中';(合法)
5、VARCHAR2
可變長度的字符,使用VARCHAR2類型時必須指定數據長度,語法如下:
VARCHAR2(size [CHAR | BYTE]) size的最大值為32767。
對於長度不同的VARCHAR2類型數據,PL/SQL對它們的處理方式是不相同的。值小的PL/SQL會優先考慮到它的性能問題,而對於值大的PL/SQL會優先考慮到內存的使用效率問題。截止點(cutoff point)為2000個字節。在2000字節以下,PL/SQL會一次性分配我們聲明時所指定大小的空間容納實際的值;2000字節或2000字節以上時,PL/SQL會動態的分配VARCHAR2的存儲容量。比如我們聲明兩個VARCHAR2類型的變量,一個長度是1999字節,一個是2000字節,如果我們把長度為500字節的值分別分配給這兩個變量,那麼前者占用的空間就是1999字節而後者只需500字節。
子類型STRING和VARCHAR,它們與VARCHAR2范圍相同,都是VARCHAR2的別名。為了和ANSI/ISO和IBM類型兼容,可以使用STRING類型,但是不建議使用VARCHAR類型,因為為了符合SQL標准,VARCHAR在將來有可能會作為一個單獨的類型出現。
注意:VARCHAR2既是PL/SQL數據類型,也是SQL數據類型,但在SQL中size的最大值為4000字節。
6、LONG
可變長度的字符,LONG類型和VARCHAR2很相似,只不過LONG最多能存儲32760個字節。Oracle推薦用COLB代替LONG。我們可以對LONG字段進行UPDATE、INSERT和SELECT操作,但不能在表達式、SQL函數調用、或某個SQL子句(如:WHERE、GROUP BY和CONNECT BY)中使用它。
注意:在SQL中使用LONG數據類型時,它的最大長度是231字節。
7、RAW
該數據類型用來存儲二進制數據,語法為:RAW(size) size的最大值為32767,也就是最多存儲32767個字節。
注意:在SQL中使用RAW數據類型時,size的最大值為2000字節。
8、LONG RAW
該數據類型也是用來存儲二進制數據,最大長度是32760字節。Oracle推薦用BLOB代替LONG RAW。
注意:在SQL中使用LONG RAW數據類型時,它的最大長度是231字節。
PL/SQL和SQL數據類型長度的對比如下圖:
9、BOOLEAN
布爾類型,值位TRUE、FALSE或者NULL。
DECLARE
a BOOLEAN :=TRUE;
b BOOLEAN DEFAULT FALSE;
c BOOLEAN NOT NULL DEFAULT TRUE;
d BOOLEAN DEFAULT NULL;
注意:不能在SQL中使用該類型。
10、ROWID和UROWID
在Oracle內部,每個數據表都有一個偽列ROWID,用於存放ROWID類型的二進制值。每個ROWID代表了一行數據的存儲地址。物理ROWID 能夠標識普通數據表中的一行信息,而邏輯ROWID能夠標識索引組織表(index-organized table)中的一行信息。其中ROWID類型只能存儲物理內容,而UROWID(universal rowid)類型可以存儲物理或者邏輯ROWID。
建議:只有在舊的應用程序中,為了兼容性我們才使用ROWID數據類型。對於新的應用程序,應該使用UROWID數據類型。
11、日期和時間類型
Date
該數據類型表示日期和時間,有效的范圍是從公元前4721年1月1日到公元9999年12月31日。如果只給定年份,那麼表示該年的1月1日 0點0分0秒。如果給定年和月,表示某年某月1日 0點0分0秒。
示例1:
DECLARE
hiredate Date;
BEGIN
hiredate:='01-2月-98'; --系統按照默認的方式將字符串轉換成日期格式
DBMS_OUTPUT.PUT_LINE(hiredate);
hiredate:=TO_DATE('2008','YYYY');
DBMS_OUTPUT.PUT_LINE(hiredate);
hiredate:=TO_DATE('2008-03','YYYY-MM');
DBMS_OUTPUT.PUT_LINE(hiredate);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(hiredate,'MM'));
END;
結果如下:
01-1月 -08
更改顯示方式:ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
重新運行結果如下:
2008-01-01 00:00:00
TIMESTAMP
該數據類型是對Date的擴展,對秒可以更精確的控制
示例2:
DECLARE
hiredate Timestamp(4);
BEGIN
hiredate:='03-2月-98 07:08:43.23';
DBMS_OUTPUT.PUT_LINE(hiredate);
hiredate:=TO_TIMESTAMP('15:12:02.020', 'HH24:MI:SS.FF');
DBMS_OUTPUT.PUT_LINE(hiredate);
END;