Oracle学习----高级篇(四)-----Oracle游标
程序员文章站
2024-03-20 10:42:10
...
Oracle游标
游标简介
- 使用游标,我们可以对具体操作数据,比如查询的结果,对行、列数据进行更加细致的处理。以及对其他DML操作进行判断等操作。
显式游标
set serveroutput on;
--定义游标
declare cursor cu_emp is select empno,ename,sal from emp;
--定义变量,接收数据
--动态指定内存 %type
-- e_no emp.empno%type;
e_no number;
e_name varchar2(10);
e_sal number;
begin
--打开游标
open cu_emp;
--取值(一条语句)
fetch cu_emp into e_no,e_name,e_sal;
-- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。
while cu_emp%found loop
dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',薪资:'||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
--关闭游标
close cu_emp;
end;
- 扩展:定义行类型
set serveroutput on;
--定义游标
declare cursor cu_emp is select * from emp where sal>2000 and sal<3000;
--定义变量,接收数据
--定义动态行类型
e emp%rowtype;
begin
--打开游标
open cu_emp;
--取值(一条语句)
fetch cu_emp into e;
-- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。
while cu_emp%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
fetch cu_emp into e;
end loop;
--关闭游标
close cu_emp;
end;
隐式游标
隐式游标的属性 | 返回值类型 | 意义 |
---|---|---|
SQL%ROWCOUNT | 整型 | 代表DML语句成功执行的数据行数 |
SQL%FOUND | 布尔型 | 值为TRUE代表插入、删除、更新或单行查询操作成功 |
SQL%NOTFOUND | 布尔型 | 值为TRUE代表插入、删除、更新或单行查询操作未成功 |
SQL%ISOPEN | 布尔型 | DML执行过程中为真,结束后为假 |
begin
if sql%isopen then
dbms_output.put_line('游标打开');
else
dbms_output.put_line('游标未打开');
end if;
end;
begin
update emp set ename='马云' where empno=123;
if sql%rowcount=1 then
dbms_output.put_line('已更新');
else
dbms_output.put_line('未更新');
end if;
end;
动态游标
- 强类型动态游标
--定义动态游标,返回类型为Emp表中的动态行类型
declare type emptype is ref cursor return emp%rowtype;
cu_emp emptype;
e_count number;
e emp%rowtype;--定义行记录
begin
select count(*) into e_count from emp where job='PRESIDENT';
if e_count=0 then
open cu_emp for select * from emp;
else
open cu_emp for select * from emp where job='PRESIDENT';
end if;
fetch cu_emp into e ;
while cu_emp%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
fetch cu_emp into e;
end loop;
--关闭游标
close cu_emp;
end;
- 弱类型动态游标
declare type customType is ref cursor;
e_count number;
e emp%rowtype;--定义行记录
s salgrade%rowtype;
cType customType;
begin
select count(*) into e_count from emp where job='PRESIDENT';
if e_count=0 then
open cType for select * from salgrade;
fetch cType into s ;
while cType%found loop
dbms_output.put_line('等级:'||s.grade||',最低薪资:'||s.losal||',最高薪资:'||s.hisal);
fetch cType into e;
end loop;
--关闭游标
close cType;
else
open cType for select * from emp where job='PRESIDENT';
fetch cType into e ;
while cType%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
fetch cType into e;
end loop;
--关闭游标
close cType;
end if;
end;