一、什么是PL/SQL PL:Procedural language SQL:Structured Query Language PL/SQL是由Oracle开发,专用于Oracle的一种程序设计语言,对SQL语句的扩展,增加了编程语言的特点 二、优点 1、改善了性能 以整个语句块发送给服务器端,降低网络拥挤 2、可重用性 能运行在任何Oracle环境中 3、模块化 每个PL/SQL单元可以包含一个活多个程序块,程序中的每一块都实现一个逻辑操作,块之间可以使独立活是嵌套。
三、块结构
1、组成
1)declare
定义部分变量,先定义后使用
2)begin
可执行部分,内容主体,以end结束
3)exception
异常处理部分,程序异常时的处理动作
2、格式
DECLARE – 可选
变量、常量、游标、用户自定义的特殊类型
BEGIN – 必须
SQL 语句
PL/SQL 语句
EXCEPTION – 可选
错误发生时的处理动作
END; – 必须
3、块类型
1)匿名块
只执行一次,不能存储在数据库中
2)过程、函数和包
是命名的PL/SQL块,存储在数据库中,能被多次执行,可以被外部程序来执行
3)触发器
是命名的PL/SQL块,存储在数据库中,当相应的触发事件发生时自动被执行
区别:
仅执行一动作时定义为过程,计算值时定义为函数
四、变量声明
1、声明语法
图示
2、%type属性
参照变量
好处
跟数据库类型保持一致
五、表达式
1、函数的应用
过程语句中的有效函数
1)单行数字:mod、round、trunc等
2)单行字符:concat length lower substr等
3)数据类型转换:to_char to_date to_number等
4)日期:add_months sysdate months_between等
无效函数
1)decode
2)分组函数(avg min max count sum等)
备注:在PL/SQL语句中适用
2、事务处理
事务开始与commit 或 rollback 后的第一个DML语句
使用commit 和 rollback 语句来终止一个事务
在事务处理过程中使用savepoint来标记中间点
六、与Oracle的交互
图
七、使用
1、变量赋值
v_name := 'sam';
2、输出结果
dbms_output.put_line('名字是'||v_name);
3、注释
1)单行注释 :--注释内容
2)多行注释 :/* 注释内容*/
八、示例代码
1、基本调用
declare
c_name constant varchar(20):='sam'; --常量定义要赋初值
n_name varchar(20) not null := 'abc'; --not null定义也要 赋初值
id int; --定义
name varchar(20) :='sam';
age number;
add varchar(20);
begin
null;
id := 10; --赋值
age := 26;
add := id || name || age; -- ||:连接字符串
dbms_output.put_line('工号:'||id); --输出
dbms_output.put_line('姓名:'||name);
dbms_output.put_line('年龄:'||age);
dbms_output.put_line('汇总:'||chr(10)||add); --chr(10)换行,
end;
输出结果:
工号:10
姓名:sam
年龄:26
汇总:
10sam26
2、调用数据库
declare
id emp.empno%type; --emp表中empno字段类型一致,%type
name emp.ename%type; --emp表中ename字段类型一致,%type
sal emp.sal%type; --emp表中sal字段类型一致,%type
begin
select empno,ename,sal into id,name,sal from emp where empno =7369; --选出员工编号为7369的信息,赋值给id,name,sal
dbms_output.put_line(id);
dbms_output.put_line(name);
dbms_output.put_line(sal);
end;
3、聚集函数
declare
num number;
max_empno emp.empno%type;
begin
num :=MOD(10,3);
dbms_output.put_line(num); --MOD求余,得 1
select max(empno) into max_empno from emp ; --求empno最大值
dbms_output.put_line(max_empno);
end;
4、事务
--事务
select * from emp ;
begin
insert into emp(empno) values(1);
savepoint a; --设置保存点 a
insert into emp(empno) values(2);
savepoint b; --设置保存点 b
rollback to savepoint a; --回滚至 保存点 a
commit; --提交,不可rollback
end;