一、什么是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)多行注释 :/* 注释内容*/
八、示例代码
demo表:
create table T_STU(STU_ID char(5),
STU_NAME varchar(8),
constraint PK_T_STU primary key (STU_ID)
);
create table T_SCORE(
EXAM_SCORE number(5,2),
EXAM_DATE date,
AUTOID number(10),
STU_ID char(5),
SUB_ID char(3),
constraint PK_T_SCORE primary key (AUTOID),
constraint PK_T_SCORE_REFE foreign key (STU_ID) references T_STU (STU_ID)
);
insert into T_STU values('1000','gk');
insert into T_STU values('1001','clc');
insert into T_STU values('1002','ccc');
-------------------------------------------------
insert into T_SCORE values (99.5,sysdate-1,10000000,'1000','000');
insert into T_SCORE values (92.5,sysdate-1,10000001,'1000','001');
insert into T_SCORE values (90.5,sysdate-1,10000002,'1000','002');
insert into T_SCORE values (89.5,sysdate-2,10000003,'1001','000');
insert into T_SCORE values (82.5,sysdate-2,10000004,'1001','001');
insert into T_SCORE values (80.5,sysdate-2,10000005,'1001','002');
insert into T_SCORE values (59.5,sysdate-2,10000006,'1002','000');
insert into T_SCORE values (52.5,sysdate-2,10000007,'1002','001');
insert into T_SCORE values (50.5,sysdate-2,10000008,'1002','002')
1、基本调用
declare
c_name constant varchar(20) := 'gaoke'; --常量定义时就要赋初值
n_name varchar(20) not null := 'curry'; --not null 定义时也要赋初值
id varchar(20);
name varchar(20) := 'gaoke';
age number;
add varchar(20);
begin
null;
id := '031302306';
age := 23;
add := id || name || age;
dbms_output.put_line('工号: '|| id);
dbms_output.put_line('姓名: '|| name);
dbms_output.put_line('年龄: '|| age);
dbms_output.put_line('汇总: '|| add);
end;
运行结果:
2:调用数据库
declare
score T_SCORE.EXAM_SCORE%type;
date1 T_SCORE.EXAM_DATE%type;
id1 T_SCORE.STU_ID%type;
begin
select EXAM_SCORE, EXAM_DATE, STU_ID into score, date1, id1
FROM T_SCORE
where AUTOID=10000002;
dbms_output.put_line(score);
dbms_output.put_line(date1);
dbms_output.put_line(id1);
end;
运行结果:
3:聚集函数
declare
num number;
max_score T_SCORE.EXAM_SCORE%type;
begin
num := MOD(10,3);
select max(EXAM_SCORE) into max_score from T_SCORE;
dbms_output.put_line(num);
dbms_output.put_line(max_score);
end;
运行结果:
4:事务
begin
insert into T_SCORE values (100,sysdate-1,70000000,'1000','000');
savepoint a; --设置保持点 a
insert into T_SCORE values (10,sysdate-1,80000000,'1000','000');
savepoint b; --设置保持点 b
rollback to savepoint a; --回滚至保存点 a
commit;
end;
运行结果:(第二条数据没有插入到数据库中)