01. PLSQL 语法(变量,if,loop,cursor,exception)
1. 语法
-
在数据库服务器上保存的打断可执行方法,供其他开发人员调用
-
可以有效的减少数据库端和服务端的数据交互,提高效率,降低带宽消耗
-
语法格式:
declare -- 定义部分,保存变量,引用型变量,记录型异常
begin -- 逻辑处理部分
exception -- 需要捕获异常是写上
end; -- 结束
2. 定义变量
定义 |
描述 |
constant |
常量 |
表名%rowtype |
记录型变量 |
表名.列名%type |
引用型变量 |
:= |
给变量赋予默认值 |
into |
把查询出来的数据进行赋值 |
declare
-- 定义变量
i number := 1;
-- 定义常量
pi constant number := 2;
-- 定义记录型变量/记录一行数据
-- 变量名 表名%rowtype;
v_emp emp%rowtype;
-- 定义引用型变量
-- 变量名.列明%type
pname emp.ename%type;
begin
select * into pemp from emp;
end;
3. if判断
4. loop循环
5. cursor游标
-
是一个私有的SQL工作区,分为隐式游标和显示游标,我们通常声明的是显示游标
-
用来操作结果的,相当于java中的迭代器
-
语法:
/*
开发步骤:
1. 声明游标: cursor 游标名 is 查询结果集
2. 打开游标: open 游标名
3. 从游标中取出数据: fetch 游标名 into 变量名
游标名%found: 找到数据
游标名%notfound: 没有找到数据
4. 关闭游标
*/
declare
emp_rows emp%rowtype;
-- 1.
cursor rows is select * from emp;
begin
-- 2.
open rows;
-- 2.1
loop
-- 3.
fetch rows into emp_rows;
-- 3.1
exit when rows%notfound;
dbms_output.put_line(emp_rows.ename);
-- 3.2
end loop;
-- 4.
close rows;
end;
6. exception异常
类型 |
描述 |
no_data_found |
找不到数据 |
too_many_rows |
匹配到多个字符 |
zero_divide |
零除 |
value_error |
算数或转换异常 |
timeout_on_resource |
在等待资源时发生超时 |
others |
最大的异常/相当于java中的exception |
7. 存储过程
-
将一个个PLSQL的业务处理过程存储起来复用,这些被存储取来的PLSQL程序称之为存储过程
-
实例:
/*
语法:
create or replace procedure 存储过程名(参数名称 in 参数类型,返回值名称 in 返回值参数类型) is
-- 定义变量
begin
end;
*/
-- 实例一: 无参数无返回值
create or replace procedure run1 is
-- 声明变量
begin
dbms_output.put_line('run1');
end;
-- 调用
begin
run1;
end;
-- 实例二: 有参数无返回值
create or replace procedure run2(i_sid in student.tid%type) is
-- 声明变量
v_sname student.sname%type;
v_sid student.tid%type;
begin
select tid,sname into v_sid,v_sname from student where tid = i_sid;
dbms_output.put_line(v_sid);
dbms_output.put_line(v_sname);
end;
-- 调用
begin
run2(1);
end;
-- 实例三: 有参数有返回值
create or replace procedure run3(i_sid in student.tid%type,i_sname out student.sname%type) is
begin
select sname into i_sname from student where tid = i_sid;
end;
-- 调用
declare
v_sname student.sname%type;
begin
run3(1,v_sname);
dbms_output.put_line(v_sname);
end;