定義并使用變量
PL/SQL有四種類型:標(biāo)量類型,復(fù)合類型,引用類型(reference),LOB(Large Obejct)類型
一.標(biāo)量類型
最常用的就是標(biāo)量類型,是指只能存放單個(gè)數(shù)值的變量,包括數(shù)字類型、字符類型、日期類型和布爾類型,每種類型又包含相應(yīng)的子類型。
常量標(biāo)量類型如下:
?
VARCHAR2
(n)?,
CHAR
(n),
NUMBER
(p,s),DATE,
TIMESTAMP
,
LONG
,
LONG
?
RAW
,BOOLEAN,BINARY_INTEGER(僅PL
/
SQL使用),BINARY_FLOAT和BINARY_DOUBLE(10g新引入的)
?
定義標(biāo)量:
identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]
使用標(biāo)量需要注意的是=號被:=取代,與delphi一樣的賦值符號@_@
例子:
?
v_name?
VARCHAR2
(
10
);

v_rate?CONSTANTS?
NUMBER
(
4
,
2
)?:
=
3.04
;
?
為了防止定義的變量類型與表中的字段類型不一致,可以使用%TYPE來定義:
?
v_name?employee.name
%
TYPE;
?
如上面所示,v_name的類型就與表employee中的name字段類型一樣!!
二。復(fù)合變量:
用于存放多個(gè)值的變量稱為復(fù)合變量,包括PL/SQL記錄,PL/SQL表,嵌套表和VARRAY四種類型
1。PL/SQL記錄
類似于C/C++中的結(jié)構(gòu)概念:
?
declare
???TYPE?employee_record?
is
?RECORD(
?????id?employee.id
%
TYPE,
?????name?employee.name
%
TYPE,
?????email?employee.email
%
TYPE);
???em_record?employee_record;
begin
???
select
?id,name,email?
into
?em_record?
from
?employee?
where
?name
=&
name;
???dbms_output.put_line(
'
雇員名:
'
||
em_record.name
||
'
?雇員ID:
'
||
em_record.id);
end
;?
?
2。PL/SQL表,類似于數(shù)組概念,不同的是PL/SQL表允許負(fù)值下標(biāo),而且沒有上下限,如:
?
declare
???TYPE?employee_table?
is
?
table
?
of
?employee.name
%
TYPE?
index
?
by
?BINaRY_INTEGER;
???em_table?employee_table;
begin
???
select
?name?
into
?em_table(
-
1
)?
from
?employee?
where
?name
=&
name;
???dbms_output.put_line(
'
雇員名:
'
||
em_table(
-
1
));
end
;?
?
3。嵌套表,與PL/SQL表相似,不同的是嵌套表可以做表列的數(shù)據(jù)類型,而PL/SQL表不能,使用嵌套表作為表列時(shí),必須為其指定專門的存儲(chǔ)表,如:
?
create
?
or
?
replace
?TYPE?emp_type??
as
?OBJECT(
??name?
VARCHAR2
(
10
),salary?
NUMBER
(
6
,
2
),hiredate?DATE);

CREATE
?
OR
?
REPLACE
?TYPE?emp_array?
IS
?
TABLE
?
OF
?emp_type;

?
CREATE
?
TABLE
?department(
????deptno?
NUMBER
(
2
),dname?
VARCHAR2
(
10
),
????employee?emp_array)NESTED?
TABLE
?employee?STORE?
as
?employee_dept;
?
4。VARRAY(變長數(shù)組),與嵌套表相似,也可以做為表列的數(shù)據(jù)類型,但是嵌套表沒有個(gè)數(shù)限制,而VARRAY有個(gè)數(shù)限制,如:
CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;
三。引用變量(reference)
類似于C++中的指針或者JAVA中引用的概念,用于存放數(shù)值指針的變量,使用此變量,可以使得應(yīng)用程序共享相同對象,降低占用空間。此類有兩種類型:游標(biāo)(REF CURSOR)和對象類型(REF OBJECT)
1。REF CURSOR,定義時(shí)同時(shí)指定SELECT語句的游標(biāo)稱為顯式或者靜態(tài)游標(biāo),在打開時(shí)才指定SELECT語句的游標(biāo)稱為動(dòng)態(tài)游標(biāo),如:
?
?
DECLARE
?
?????TYPE?c1?
IS
?REF?
CURSOR
;
?????emp_cursor?c1;
?????v_name?employee.name
%
TYPE;
?????v_sal?employee.salary
%
TYPE;
????
begin
?????
open
?emp_cursor?
for
???????
SELECT
?name,salary?
FROM
?EMPLOYEE?;
?????LOOP
???????
FETCH
?emp_cursor?
INTO
?v_name,v_sal;
???????
EXIT
?
WHEN
?emp_cursor
%
NOTFOUND;
???????dbms_output.put_line(v_name);
?????
END
?LOOP;
?????
close
?emp_cursor;
????
end
;??
??
2。REF OBJECT,與JAVA的引用概念相同,存儲(chǔ)的是指向?qū)ο蟮闹羔?/p>
?
四。LOB類型
LOB類型是指用于存儲(chǔ)大批量數(shù)據(jù)的變量,包括內(nèi)部的3種(CLOB,BLOB,NCLOB)和外部LOB(BFILE)。
CLOB,NCLOB用于存儲(chǔ)大量的字符數(shù)據(jù)。
BLOB用于存儲(chǔ)大批量二進(jìn)制數(shù)據(jù)(如圖象)。
BFILE則存儲(chǔ)指向OS文件的指針。