/*
游标:可以用来存放查询结果,逐行提取查询结果,以编程的方式访问数据
类型:1.隐式游标;2.显示游标;3.引用游标
*/
/*
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
隐式游标的属性有:
1.%FOUND – SQL 语句影响了一行或多行时为 TRUE
2.%NOTFOUND – SQL 语句没有影响任何行时为TRUE
3.%ROWCOUNT – SQL 语句影响的行数
4.%ISOPEN - 游标是否打开,始终为FALSE
*/
create or replace procedure sopV(obj varchar2)
as -- 定义一个存储过程,用于输出字符串,简化书写
begin
dbms_output.put_line(obj);
end;
create or replace procedure sopN(obj number)
as -- 定义一个存储过程,用于输出number类型
begin
dbms_output.put_line(obj);
end;
-- 隐式游标1
declare
v_ename emp.ename%type;
v_sql varchar2(200);
v_no number := '&编号:';
begin
v_sql := 'select * from emp where empno =: no';
execute immediate v_sql using v_no;
if sql%notfound then-- 如果没有影响函数,notfound
sopV('没有找到!');
elsif sql%found then
sopN(sql%rowcount);
end if;
end;
--隐式游标2
declare
v_name varchar2(20) := 'ysjian';
begin
update emp set ename = v_name where empno = 7369;
if sql%found then
sopV('更新成功');
sopN(sql%rowcount);
elsif sql%notfound then
sopV('没有找到!');
end if;
end;
--隐式游标3
declare
v_emp_rec emp%rowtype;
v_empno number := '&empno';
begin
select * into v_emp_rec from emp where empno=v_empno;
if sql%notfound
then dbms_output.put_line('没有找到');
else
dbms_output.put_line(v_emp_rec.empno||'-->'||v_emp_rec.ename);
end if;
exception
when no_data_found -- 异常类型,没有找到数据时
then dbms_output.put_line('data no found exception!');
end;
--显示游标1,关键字,cursor is opoen fetch close
declare
v_emp emp%rowtype;
cursor v_cur is -- 此处与一般的变量声明不同,类型发在名称前面,关键字不能用as,用is
select * from emp;
begin
open v_cur; --打开游标
loop
fetch v_cur into v_emp; --提取游标
sopV(v_emp.ename);
exit when v_cur%notfound;
end loop;
close v_cur; -- 关闭游标
end;
-- 显示游标2,for循环遍历,打开,提取和关闭游标的操作自动完成
declare
v_emp emp%rowtype;
cursor v_cur is select * from emp;
begin
for res in v_cur
loop
sopV(res.ename);
end loop;
end;
--显示游标3,带参数
declare
v_emp emp%rowtype;
cursor v_cur(parameter varchar2) is select * from emp where ename = parameter;
begin
for v_res in v_cur('&ename:')
loop
sopV(v_res.ename);
end loop;
end;