程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> PL/SQL塊定義部分之一標量類型

PL/SQL塊定義部分之一標量類型

編輯:Oracle數據庫基礎

定義部分主要定義變量和常量,語法如下:

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved