一、为什么要学PL/SQL编程
使用PLSQL语言操作Oracle数据库的效率最高。
之前用sql语句是命令式的语言,但如果案例是复杂的,比如需要分条件来做不同的事情的,就需要PL/SQL效率会更高,不需要用其他的编程语言。
PL/SQL介绍
全称是Procedure Language/SQL,是oracle对sql语言的过程化扩展
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。
(1)是sql的扩展,支持sql语句。
(2)是面向过程的语言。
二、语句块通用格式
declare
--说明部分(变量说明、光标申明、例外说明)
begin
--程序体(DML语句)
dbms_output.put_line('Hello World');
exception
--例外处理语句
end;
/
/ --这个正斜杠用来退出前面的代码编写并且执行语句
--查看程序包的结构
desc 程序包名字
三、打开输出开关
set serveroutput on
四、不同数据库中SQL扩展
Oracle:PL/SQL
DB2:SQL/PL
SQL Server:Transac-SQL(T-SQL)
五、PL/SQL的说明部分
定义基本变量
类型:char,varchar2,date,number,boolean,long
举例:名字在片面,变量是在后面,:=为赋值符号不是单=号
var1 char(15);
married bollean := true;
psal number(7,2); --说明有两位小数
定义引用型变量
my_name emp.ename%type; --引用ename的类型,ename是啥类型变量就是啥类型
第二种赋值方式:
select ename,sal into pename,psal from emp where empno=7839;
这里的into就可以赋值,是一一对应的。
定义记录型变量
emp_rec emp%rowtype;
--取表中一行的类型,作为变量的类型,可以理解为数组,如果需要取用到列里面的某一行,就像如下写法:
emp_rec.ename := 'ADAMS'; --ename是列的名字。
六、PL/SQL的流程控制语句
(1)if语句:
情况一
if 条件 then 语句1;
语句2;
end if;
情况二
if 条件 then 语句序列1;
else 语句序列2;
end if;
情况三
if 条件 then 语句;
elsif 语句 then 语句; --特别注意下elsif
else 语句;
end if;
(2)while循环:
while total <= 25000 loop
...
total := total + salary;
end loop;
(3)loop循环:
--在控制光标的时候比较简单
loop
exit[when 条件];
......
end loop;
(4)for循环:
for i in 1..3 loop --表示连续区间用这种写法
语句序列;
end loop;
七、光标
(1)光标的引入背景
select如果返回的结果有多行的话就会出错,所以需要引入光标,光标cursor就是一个结果集。也叫游标。
(2)光标的语法
cursor 光标名 [(参数名 数据类型[,参数名 数据类型]...)] is select 语句;
如
cursor c1 is select ename from emp;
此外,光标是可以带参数的。
(3)光标的一些操作
打开光标:
open c1;(打开光标执行查询)
关闭光标:
close c1;(关闭游标释放资源)
取一行光标的值:
fetch c1 into pename; (取一行到变量中)
fetch的作用:
(1)把当前指针指向的记录返回;
(2)将指针指向下一条记录。
(4)光标的属性
%found(光标能取到内容返回true,否则false)
%notfound(与前者相反)
%isopen:判断光标是否打开
%rowcount:影响的行数,不是总行数,比如光标取走了10行的数据,那么这个值就是10
(5)光标的限制
默认情况下,oracle数据库只允许在同一个会话中打开300个光标
修改光标数的限制:
alter system set open_cursors=400 scope=both;
scope是范围,取值有三个:both, memory(只更改当前实例), spfile(只更改参数文件,数据库需要重启)
八、例外
(1)例外的概念
例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
(2)例外的分类
系统例外
自定义例外
(3)系统例外
no_data_found 没有找到数据,select语句没有找到结果的时候
too_many_rows select...into语句匹配多个行
zero_divide 被零除
value_error 算术或转换错误
timeout_on_resource 在等待资源时发生超时(分布式数据库的访问会用到)
(4)自定义例外
定义变量,类型是exception
使用raise关键字抛出自定义例外
九、程序设计方法
瀑布模型:
需求分析
设计1.概要设计2.详细设计
编码Coding
测试Testing
上线
以上步骤就像水流一下,最忌讳一上来就编码。
想明白SQL语句、变量。
变量:1.初始值是多少2.最终值如何得到
十、其他小技巧:
使用||符号来连接文本字符串。
--表示单行注释,/* */表示多行输入
单个等于号表示判断。
plsql中大小写不敏感。
then语句相当于一个大括号,后面的语句可以一起被处理,比如如下写法:
when zero_divide then dbms_output.put_line('1:0不能做被除数');
dbms_output.put_line('2:0不能做被除数');
这里两句话都会被打印出来。
把握一个原则:能不操作数据库就不操作数据库,比单单加减乘除的计算慢。
===================================================================================