1. PL/SQL语言的介绍
PLSQL语言是Oracle公司对SQL语言的功能的扩展,它是将过程性结构与OracleSQL无缝的集成在一起而产生的一种结构化的强有力的语言,是一种高级数据库程序设计语言。
2. PL/SQL格式
[declare] --声明变量
变量名 变量的类型;--此处可以声明变量,常量,游标,异常
begin
业务逻辑
[exception]--异常
异常处理语句
end;
3. 变量和常量
变量
:= 在PL/SQL中是赋值的意思
%type 引用类型变量
v_sal emp.sal%type;
v_sal的类型,与emp表 中sal字段的类型一致
%rowtype 记录型变量
v_obj emp%rowtype;
v_obj可以和emp表中某一行的所有类型一致(将emp表中的某一条数据,存储在v_obj中,可以使用 v_obj.字段名,来查询数据)
常量
constant 常量 相当于 java final;
4. if分支
格式一
if 条件 then
业务逻辑
end if;
格式二
if 条件 then
业务逻辑
else
业务逻辑
end if;
格式三
if 条件 then
业务逻辑
elsif 条件 then
业务逻辑
...
elsif 条件 then
业务逻辑
else
业务逻辑
end if;
例:输入一个年龄数据,如果小于18,打印“未成年人”,18到60 成年人,60以上 老年人
declare
v_age number(4):=&sjdj;
begin
if v_age<18 then
dbms_output.put_line('未成年人');
elsif v_age>=18 and v_age<=60 then
dbms_output.put_line('成年人');
else
dbms_output.put_line('老年人');
end if;
end;
5. 循环
死循环
loop
循环的内容
end loop;
--循环输出1-100个数
declare
v_num number(3):=1;
begin
loop
if v_num>100 then
exit;--退出循环
end if;
--exit when v_num>100;--上面3行可用这一行代替
dbms_output.put_line(v_num);
v_num:=v_num+1;
end loop;
end;
while循环
while 条件
loop
循环的内容
end loop;
--循环输出1-100个数
declare
v_num number(3):=1;
begin
while v_num <101
loop
dbms_output.put_line(v_num);
v_num:=v_num+1;
end loop;
end;
for循环
for 变量 in 条件
loop
循环的内容
end loop;
--循环输出1-100个数
declare
v_num number(3):=1;
begin
for v_num in 1..100
loop
dbms_output.put_line(v_num);
end loop;
end;
6. 游标
- 为什么使用游标?
游标可以存储查询返回的多条数据,类似java中的集合 - 游标的定义格式
declare
cursor 游标名称 is sql查询语句;
begin
open 游标名称 ;
loop
fetch 游标名称 into 记录型变量 ; -- 使用关键字fetch将游标中的一条数据取出,使用into关键字将数据放入一个变量中
exit when 游标名称%notfound; -- 当游标中没有数据的时候,退出循环
end loop;
close 游标名称;
end;
例子:打印指定部门的员工的信息
第一种:死循环
declare
cursor c1 is select * from emp where deptno=10; ----给游标赋值
v_obj emp%rowtype;
begin
open c1; ----打开游标
loop
fetch c1 into v_obj;
exit when c1%notfound; --判断游标为空后跳出,不跳出,一直指向最后一条数据
dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
end loop;
close c1 ;----关闭游标
end;
第二种:for循环
declare
cursor c1 is select * from emp where deptno=10; --给游标赋值
v_obj emp%rowtype;
begin
for v_obj in c1 ---帮助我们做 open 和 close 操作
loop
dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
end loop;
end;
带参数的游标
declare -----参数的变量类型 不能写长度
cursor c1(dno number) is select * from emp where deptno=dno; ----给游标赋值
v_obj emp%rowtype;
begin
open c1(20); ----打开游标 并赋值
loop
fetch c1 into v_obj;
exit when c1%notfound; --判断游标为空后跳出
dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
end loop;
close c1 ;--关闭游标
end;
7. 异常
异常的定义格式
declare
v_num number(3) :=7;
begin
v_num :=v_num/0;
exception ---开始捕获异常
when zero_divide then
dbms_output.put_line('这是个除零异常');
end;
常见异常
no_data_found 没有找到数据
too_many_rows select...into语句匹配多行
zero_divide 除零异常
value_ereor 算术或者转换错误
timeout_on_resource 在等待资源时发生超时异常
例子
捕获除零异常
declare
v_num number(3) :=7;
begin
v_num :=v_num/0;
exception ---开始捕获异常
when zero_divide then
dbms_output.put_line('这是个除零异常');
end;
捕获最大的异常(记不住zero_divide时,写others,都捕获所有异常)
declare
v_num number(3) :=7;
begin
v_num :=v_num/0;
exception ---开始捕获异常
when others then --others相当于java中的Exception,即others代表了所有异常
dbms_output.put_line('这是个除零异常');
end;
异常的作用
增强代码的容错性和健壮性
8. 自定义异常
declare
v_age number(3) := 0;
ex_age exception;--声明异常类型的变量
begin
v_age :=&sb;
if v_age >140 then
raise ex_age;--抛出异常
if v_age<18 then
dbms_output.put_line('萝莉or正太');
elsif v_age>=18 and v_age<60 then
dbms_output.put_line('大叔or小姐姐');
else
dbms_output.put_line('广场舞主力');
end if;
exception--捕获异常
when ex_age then
dbms_output.put_line('未知生物');
end;