方式一:
set serverout on;
//这里定义的游标cu_emp可以理解为一个数组一样的东西
declare cursor cu_emp is select empno,ename,sal from emp;
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如果数据存在的话输出
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;
输出:
编号:9000,姓名sb,基本薪资
编号:7369,姓名SMITH,基本薪资800
编号:7499,姓名ALLEN,基本薪资1600
编号:7521,姓名WARD,基本薪资1250
编号:7566,姓名JONES,基本薪资2975
编号:7654,姓名MARTIN,基本薪资1250
编号:7698,姓名BLAKE,基本薪资2850
编号:7782,姓名CLARK,基本薪资2450
编号:7788,姓名SCOTT,基本薪资3000
编号:7839,姓名KING,基本薪资5000
编号:7844,姓名TURNER,基本薪资1500
编号:7876,姓名ADAMS,基本薪资1100
编号:7900,姓名JAMES,基本薪资950
编号:7902,姓名FORD,基本薪资3000
编号:7934,姓名MILLER,基本薪资1300
方式二:(动态指定自定变量类型)
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
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;
//输出结果和上面的一样就不贴出来了
方式三:(定义一个一行的变量e emp%rowtype;)
set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
open cu_emp;
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;
方式四:(隐式游标学习)
begin
if sql%isopen then
dbms_output.put_line('游标已打开');
else
dbms_output.put_line('游标未打开');
end if;
end;
SQL> declare e_count number;
2 begin
3 select count(*) into e_count from emp;
4 dbms_output.put_line('游标捕获记录数'||sql%rowcount);
5 end;
6 /
游标捕获记录数1
方式五:(动态游标)
SQL> declare type customType is ref cursor;
2 e_count number;
3 e emp%rowtype;
4 s salgrade%Rowtype;
5 cType customType;
6 begin
7 select count(*) into e_count from emp where job='PRESIDENT';
8 if e_count=0 then
9 open cType for select * from salgrade;
10 fetch cType into s;
11 while cType%found loop
12 dbms_output.put_line('等级:'||s.grade||',最低薪资'||s.losal||',最高薪资'||s.hisal);
13 fetch cType into s;
14 end loop;
15 close cType;
16 else
17 open cType for select * from emp where job='PRESIDENT';
18 fetch cType into e;
19 while cType%found loop
20 dbms_output.put_line('编号:'||e.empno||',姓名'||e.ename||',基本薪资'||e.sal);
21 fetch cType into e;
22 end loop;
23 close cType;
24 end if;
25 end;
26 /
编号:7839,姓名KING,基本薪资5000
PL/SQL procedure successfully completed
SQL> declare type customType is ref cursor;
2 e_count number;
3 e emp%rowtype;
4 s salgrade%Rowtype;
5 cType customType;
6 begin
7 select count(*) into e_count from emp where job='PRESIDENT1';
8 if e_count=0 then
9 open cType for select * from salgrade;
10 fetch cType into s;
11 while cType%found loop
12 dbms_output.put_line('等级:'||s.grade||',最低薪资'||s.losal||',最高薪资'||s.hisal);
13 fetch cType into s;
14 end loop;
15 close cType;
16 else
17 open cType for select * from emp where job='PRESIDENT';
18 fetch cType into e;
19 while cType%found loop
20 dbms_output.put_line('编号:'||e.empno||',姓名'||e.ename||',基本薪资'||e.sal);
21 fetch cType into e;
22 end loop;
23 close cType;
24 end if;
25 end;
26 /
等级:1,最低薪资700,最高薪资1200
等级:2,最低薪资1201,最高薪资1400
等级:3,最低薪资1401,最高薪资2000
等级:4,最低薪资2001,最高薪资3000
等级:5,最低薪资3001,最高薪资9999
PL/SQL procedure successfully completed
附:
1、
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no number;
e_name varchar2(10);
e_sal number;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
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;
2、
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
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;
3、
set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
open cu_emp;
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;
4、
begin
if sql%isopen then
dbms_output.put_line('游标已打开');
else
dbms_output.put_line('游标未打开');
end if;
end;
declare e_count number;
begin
select count(*) into e_count from emp;
dbms_output.put_line('游标捕获记录数'||sql%rowcount);
end;
5、
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='PRESIDENT1';
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 s;
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;