PL/SQL(procedure
language/SQL)语言是Oracle对SQL语言的过程化扩充,是一个完整的编程语言。
PL/SQL实现了过程化语句(如分支、循环等)与SQL语句的无缝连接,将过程化语言的数据处理能力与SQL语言的访问数据库的能力有机地结合在一起。
PL/SQL语言在Oracle系统中是核心的编程语言,它应用于很多方面,如存储过程、触发器、包、函数和Web应用等。
PL/SQL语言编写的不是客户端程序,而是服务器端的程序
PL/SQL字符集
合法字符
所有大小写字母
数字0~9。
符号:(
) +-* /〈〉=!~;:.‘@ % “# $ ^ & _ | { } ? [ ]。
其中一些字符用于编程,另一些用作算术运算操作符(除法、加法、幂等)及关系运算符(等于和不等于)。
算术运算符
运算符意义
+ 加法
- 减法
* 乘法
/ 除法
**
幂
|| 连接
关系运算符
下面列出了PL/SQL中常用的关系运算符。
运算符意义
<> 不等于
!= 不等于
^=
不等于
< 小于
> 大于
= 等于
>=
大于等于
<= 小于等于
其他符号(非常重要,不要小瞧)
PL/SQL为支持编程,还使用其他符号。下面列出了常用的符号。
( )
列表分隔(‘Jones‘,‘Roy‘,‘Abramson‘)
;
语句结束Procedure_name(arg1,arg2);
.
项分隔(Select * from account.table_name;)
’
字符串界定符if var1=‘SANDRA‘
:=
赋值Rec_read:=rec_read+1;
||
并置Full_name:=‘Nahtan‘||‘‘||‘Yebba‘
--
注释符—This is a comment
/*与*/
注释定界符/*This,too,is a comment*/
PL/SQL块结构
例如:
DECLARE
v_n NUMBER(20);
BEGIN
v_n:=65/0;
EXCEPTION
WHEN ZERO_DIVIDE
THEN
dbms_output.put_line(‘divided by
zero‘);
END;
“匿名”(anonymous)块通常是动态生成,它只能被执行一次。
“子程序”(subprogram)是存储在数据库内部的过程、包、触发器和函数,通过显式调用可以执行该子程序。
“函数”(function)除了必须返回一个值外,它与存储过程(procedure)相似。
“触发器”(trigger)是存储在数据库内部的带名块。当触发事件出现时,触发器便被显式地执行。
PL/SQL变量
变量类型
Scalar
标量型
Composite 复合型
Reference 引用型
LOB (large objects)
大对象型
非PL/SQL变量
链接变量
声明PL/SQL变量
identifier
[CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
Declare
v_hiredate
DATE;
v_deptno
NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) :=
‘Atlanta‘;
c_ comm
CONSTANT NUMBER := 1400;
在同一PL/SQL块中不能有两个相同的变量名。
在同一PL/SQL块中变量名不能和表的列名相同。
显然赋值操作符:
:=
赋值操作符
基本标量数据类型
VARCHAR2
(maximum_length)
NUMBER
[(precision, scale)]
DATE
CHAR
[(maximum_length)]
LONG
LONG
RAW
BOOLEAN
BINARY_INTEGER
(1)Varchar2为可变长的字母数字数据类型。在PL/SQL中,varchar2的最大长度为32767字节。如
vc_field varchar2(10):=‘STARTVALUE‘;
(2)number类型数据可用来表示所有的数值数据,说明格式为:
num_field
number(precision,scale);
其中,precision可以有1~38个数字位,而scale(-84~127)表示在precision位数字中小数点后的数字位数,下面的定义:
num_fieldnumber(12,2);
表示num_field是一个整数部分最多10位、小数部分最多2位的变量。
(3)DATE
此数据类型用于保存固定长度的日期值,date变量的说明为:
date_field date;
在缺省时,Oracle以DD-MON-YY格式显示日期。因此,2004年9月9日显示为09-SEP-04。
PL/SQL中编程处理日期必须使用这种格式。是否可以说用户必须用数据库缺省的日期格式,除非用户用TO_CHAR或TO_DATE。
提示:Oracle中还有DD-MON-RR的日期格式,用来表示4位年份以确保Oracle不会省去两位纪元数。
(4)BOOLEAN
Boolean变量只有三种值TRUE、FALSE和NULL。
Boolean变量一般和逻辑操作符AND, OR, 和
NOT一起使用。
Examples
v_job
VARCHAR2(9) DEFAULT ‘CLERK‘;
v_count
BINARY_INTEGER :=
0;
v_total_sal
NUMBER(9,2) := 0;
v_orderdate
DATE := SYSDATE + 7;
c_tax_rate
CONSTANT NUMBER(3,2) := 8.25; (定义常量时必须同时为它赋值,否则会出现错误。)
v_valid
BOOLEAN NOT NULL :=
TRUE;
%TYPE属性
声明一个变量根据下述条件来声明:
数据库中定义的列
先前已经声明的变量
使用%TYPE属性的前缀:
数据库的表和列名
先前声明的变量名
用%TYPE属性声明变量
examples:
...
v_ename
emp.ename%TYPE;
v_balance
NUMBER(7,2);
v_min_balance
v_balance%TYPE :=
10;
...
这种定义方法有以下好处:
在不清楚EMP表的列定义细节的情况下,也可以保证两者定义一致。
如果改变数据库中EMP表的ename列定义,不需要修改PL/SQL程序中V_ENAME变量定义。
也就是说上述
的v-ename 和 v-min_balance的 PL/SQL的数据类型和 emp.ename,v-balance的数据
一样。
%ROWTYPE属性:声明一个与数据库表的行具有相同类型的记录变量