一、变量的种类
PL/SQL中变量主要有以下几类:
Scalar:标量,单一变量,如Integer,Character等等,最为常见,使用最广;
Composite:复合变量,里面还有多种子结构,如数组等,使用也比较广泛;
Reference:引用类型,类似指针,指向某个类型
Large object(LOB):CLOB(CharacterLarge Object,存储文档),BLOB(Binary Large Object,存储二进制文件,如图片、声音等)
Non-PL/SQL variables: Bindvariables:绑定变量,环境变量。所谓环境就是指的PL/SQL所允许的环境,因为PL/SQL可以运行在C语言,JAVA语言等等语言中,C语言和JAVA语言就是PL/SQL的环境,有环境就需要对环境进行一些定义和配置,这就是这种变量的作用。
二、声明和初始化变量的标准
变量声明和初始化应遵循以下标准
1. 遵循命名规范,这样有利于代码的可维护性
2. 见名知意,使用有意义的名字
3. 每一行定义一个变量,以便与代码的维护
4.对于定义为非空或常量的变量进行初始化
5. 使用":="或者“DEFAULT”来赋初值
6.不要使用列名来作为变量名以防止混淆:因为如果一个变量和列名一样,PL/SQL则优先将其解释为列名。如下面这个例子:
SQL> edit
DECLARE employee_id NUMBER(6); BEGIN SELECT employee_id INTO employee_id -- 变量名和列名重复了,容易发生混淆 FROM employees WHERE last_name = 'Kochhar'; DBMS_OUTPUT.PUT_LINE('The resultis ' || employee_id); END;
SQL> /
Theresult is 101 PL/SQLprocedure successfully completed.
其中变量名和列名重合了,虽然有时候可以运行,但无法保证结果正确。
7. 如果constraint定义为NOT NULL,则声明时必须为其赋初值。
三、各类型变量详解
1. Scalar Variable标量
Scalar变量是使用最广泛的一种变量,它只包含单一的值,内部没有更复杂的结构,例如:
TRUE――Boolean;
25-JAN-01――Date;
256120.08――Number;
“Atlanta”――String;
“The Soul ofthe lazy man desires, and he has nothing; but the soul of the diligent shall bemade rich.”――String(如果该值不长,比如CHAR或VARCHAR通常最多可存储2000到4000个字符,则可以作为字符串,否则最好作为CLOB类型,即无结构文档);
常见的Scalar变量主要有以下几种:
CHAR [(maximum_length)] ――长度不可变
VARCHAR (maximum_length) ――长度可变
NUMBER [(precision,scale)]
BINARY_INTEGER
BINARY_FLOAT
BINARY_DOUBLE
PLS_INTEGER
BOOLEAN
DATE
--------------以下几类在内部其实都存储为数字-----
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
下这个例子演示了如何定义Scalar变量:
DECLARE v_emp_job VARCHAR2(9) v_count_loop BINARY_INTEGER := 0; v_dept_total_sal NUMBER(9,2) := 0; v_orderdate DATE := SYSDATE + 7; c_tax_rate CONSTANT NUMBER(3,2):= 8.25; v_valid BOOLEAN NOTNULL := TRUE; ...
Scalar变量中的布尔型变量有以下几个特点:
1. Oracle中BOOLEAN型的变量和其他编程语言不同,它除了TRUE和FALSE以外,还有NULL值;
2. 在进行条件判断时,可以使用逻辑操作符: AND, OR和NOT;
3. 数字、字符和表达式都可以返回布尔型的值。
2. Bind Variable绑定变量
绑定变量也称为环境变量,PL/SQL中的环境变量有以下特点:
1. 在特定环境中创建:如在C语言中,或者是在JAVA语言中;
2. 由于它是在环境中创建的,故也称为宿主变量;
3. 如果是在sql*plus中使用,则用关键字 VARIABLE来定义它;
4. 它可以用在SQL语句中,也可以用在PL/SQL块中;
5.即使PL/SQL块执行结束了,该环境变量仍然能够访问,因为即使程序结束了,环境是不会结束的;
6. 引用环境变量时,要在环境变量前面加上冒号“:”
下面来举例演示如何使用绑定变量:
SQL> VARIABLE b_salary NUMBER;
-- 在sql*plus中定义环境变量,使用VARIABLE关键字
SQL> edit
BEGIN SELECT salary INTO :b_salary -- 在PL/SQL块中引用绑定变量b_salary时,需要在变量前面加上冒号 FROM employees WHERE employee_id = 178; END;
PL/SQLprocedure successfully completed.
SQL> PRINT b_salary;
--PL/SQL块已经运行完毕了,仍然能够访问到变量b_salary; -- PRINT是sql*plus的命令,且现在不在PL/SQL块中,故引用该变量时无需加上冒号 B_SALARY ---------- 7000
SQL> SELECT first_name, last_name FROMemployees WHERE salary =:b_salary;
-- 由于b_salary是环境变量,故还能访问到;这里执行的是SQL语句,故需要使用冒号表示引用 FIRST_NAME LAST_NAME --------------------------------------------- Oliver Tuvault Sarath Sewall Kimberely Grant
如果设置autoprint为打开状态,则可以将结果自动打印到屏幕上
SQL> VARIABLE b_emp_salary NUMBER
SQL> SET AUTOPRINT ON
# 设置自动打印功能
SQL> edit
1 DECLARE 2 v_empno NUMBER(6) :=&empno; 3 BEGIN 4 SELECT salary 5 INTO :b_emp_salary 6 FROM employees 7 WHERE employee_id = v_empno; 8 END; 9 /
Entervalue for empno: 178 old 2: v_empno NUMBER(6) :=&empno; new 2: v_empno NUMBER(6) :=178; PL/SQLprocedure successfully completed. B_EMP_SALARY ------------ 7000
3. LOB Large Object 数据类型
LOB类型的数据主要有以下几种:
A. CLOB――用来存放字符串;
B. BLOB――用来存放二进制文件,如图片等;
C. BFILE――因为这类文件体积很大,故存放在磁盘上,而数据库中存放的只是指针,而不是文件本身,它的访问速度可能会比BLOB更快
D. NCLOB――用来存放一些非英文字母的文字
4. Composite 复合变量
复合型变量中可以存放多种其他类型的变量,如RECORD, AREA,TABLE等类型的变量,其中还可以存放布尔型、日期型、字符型、LOB型的其他变量。
四、 %TYPE的作用
%TYPR是PL/SQL中独有的一种属性。比如以下这个语句:
SELECT first_name
INTO v_fname
其中fist_name和v_fname的值是同一列,为了避免hardcode,即将代码写死在程序里,就可以用到%TYPE,在声明变量时使用%TYPE来表明该变量的数据类型和数据库中某张表某一列的数据类型是一致的。
以下两种情况可以用到%TYPE:
1. 和数据库中某一列类型相同;
2. 和另外一个已经声明过了变量类型相同。
使用%TYPE时需要加上前缀,这些前缀可以是:
1. 数据库中的表名和列名;
2. 已经定义过的变量名。
使用%TYPE来定义变量的格式如下:
identifier table.colum_name%TYPE;
下面来举例说明%TYPE的用法:
例1.
... emp_lname employees.last_name%TYPE; -- 定义一个变量emp_lname,它的数据类型和employees这个表中的last_name这一列是一致的 ...
例2.
... balance NUMBER(7,2); -- 定义第一个变量 balance,其数据类型为NUMBER min_balance balance%TYPE:=1000; -- 定义第二个变量min_balance,其数据类型引用前一个变量balance的数据类型 ...