2018-08-31-Oracle学习第五天
1、--异常处理(了解)
-- 也就是,当发现有异常出现,则捕获提示。
-- 预定义的 Oracle 异常,有异常名,有错误代码,有异常信息。
-- 非预定义的 Oracle 异常,有错误代码,有异常信息,但是没有异常名字。
-- 在实际开发中,我们的异常处理,一般情况下都是需要使用 Java 代码方式来处理。
-- 因为我们学习的 Java 语言是面向对象的
-- Oracle 数据库其实是一个关系型数据库,如果要操作的话,太麻烦了。
-- C 面向过程:步骤需要详细到每一步,所有的资源释放都要自己来。
-- Java 面向对象:所有的业务逻辑,交给对应的对象去执行。
eg:
--异常test
declare
vid tb_student.id%type;
vname tb_student.name%type;
begin
select id,name into vid,vname
from tb_student
where id=3;
dbms_output.put_line('vid 的值:' || vid );
dbms_output.put_line('vname 的值:' || vname );
exception
when too_many_rows then
dbms_output.put_line('返回数据过多');
when no_data_found then
dbms_output.put_line('找不到对应的数据');
when others then
dbms_output.put_line('其实我也懵的..不知道发生了什么');
end;
2、--游标
/************************************
游标:用来提取多行数据(了解)
Oracle 打开一个工作区(内存区域)来保存多行查询的结果集,
游标就是给这个工作区命的名称,并能用于处理由多行查询而返回的记录行。
隐式游标: 默认的 DML 语句和 select 语句都有隐式游标。
显示游标: 开发中给工作区命名,并且可以进行操作。
%ISOPEN Boolean 游标打开,则返回True(游标打开之后,不能再次打开,游标关闭之后,不能再次关闭)
%NOTFOUND Boolean 如果最近抓取没有获得记录,返回True
%FOUND Boolean 如果最近抓取获得记录,返回True
%ROWCOUNT Number 返回到目前为止获取的记录数
使用游标的步骤:
1. 定义游标 CURSOR c_tb_stuu IS SELECT * FROM tb_stuu;
2. 打开游标 OPEN c_tb_stuu;
3. fetch游标 FETCH c_tb_stuu INTO r_tb_stuu;
游标有个指针,默认指向第一行之上,fetch将指针向下移动,指向第N行数据,
如果有数据,NOTFOUND返回false,FOUND返回true。
如果到末尾,会一直抓取最后一条数据
4. 关闭游标 CLOSE c_tb_stuu;
************************************/
eg:
declare
v_id tb_student.id%type;
v_name tb_student.name%type;
v_sex tb_student.sex%type;
cursor curTest /*声明游标*/
is
select id,name,sex
from tb_student;
begin
open curTest; /*打开游标*/
fetch curTest into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/
while curTest%found loop
dbms_output.put_line('id:'||v_id||'姓名:'||v_name||'性别:'||v_sex);
fetch curTest into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/
end loop;
close curTest;
end;
/********带参数的游标**********/
declare
v_id tb_student.id%type;
v_name tb_student.name%type;
v_sex tb_student.sex%type;
v_address tb_student.address%type;
cursor curTest2 /*声明游标2*/
is
select id,name,sex
from tb_student;
cursor curTest3(vid tb_student.id%type) /*声明带参数的游标3*/
is
select address
from tb_student
where id=vid;
begin
--↓↓先打开外层游标
open curTest2; /*打开游标*/
fetch curTest2 into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/
while curTest2%found loop
dbms_output.put_line('id:'||v_id||'姓名:'||v_name||'性别:'||v_sex);
--↓↓打开内层游标
open curTest3(v_id);
fetch curTest3 into v_address;
while curTest3%found loop
dbms_output.put_line(v_id||'的地址为:'||v_address);
fetch curTest3 into v_address;
end loop;
close curTest3;
--↑↑关闭内层游标
fetch curTest2 into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/
end loop;
close curTest2;
--↑↑关闭外层游标
end;
3、--存储过程
-- 过程,可以简单理解为是一个函数。
-- 函数和过程的区别:函数总是向调用者返回数据,而过程没有数据返回。
-- Oracle 可以将 PL/SQL 代码存储在数据库中,然后可以提供给其他地方来运行它。
-- 这个动作就叫存储过程,也可以理解为一个创建一个函数给其他人用。
-- 语法格式
procedure 名字(参数)
is
声明局部变量;
begin
语句
end;
eg:--创建一个叫procTest的存储过程
create or replace procedure procTest(p_id in tb_student.id%type,p_name in tb_student.name%type,p_sex in tb_student.sex%type)
as
begin
insert into tb_student(id,name,sex) values(p_id,p_name,p_sex);
commit; -- 提交数据
dbms_output.put_line('插入成功!');
end;
--调用存储过程
execute procTest(8,'张三丰','女');
***-- 存储过程也可以使用图形界面方式创建:文件 → 新建 → 程序窗口 → procedure