1. 利用游标技术将‘95001’学生选修的所有课程名称放进一个嵌套表变量中,然后遍历该嵌套表并输出该学员选修的课程名称。
执行结果形式如下:
95001 选修的课程如下:
数据库
数学
信息系统
数据结构
PL/SQL 过程已成功完成。
SET SERVEROUTPUT ON
declare
v_cno sc.cno%type;
v_cname course.cname%type;
cursor c_cno is select cno from sc where sno='95001';
begin
open c_cno;
loop
fetch c_cno into v_cno;
exit when c_cno%notfound;
select cname into v_cname from course where v_cno=cno;
dbms_output.put_line(v_cname);
end loop;
close c_cno;
end;
2. 用带参数的显式游标技术将用户输入学号的学生选修的所有课程成绩放进一个VARRAY变量中,然后遍历该VARRAY并输出该学员选修的课程成绩。
执行结果形式如下:
输入 sno 的值: 95001
原值 10: v_sno:='&sno';
新值 10: v_sno:='95001';
95001 选修的课程成绩如下:
58
85
70
92
0
PL/SQL 过程已成功完成。
SET SERVEROUTPUT ON
declare
v_grade sc.grade%type;
vsno sc.sno%type;
cursor v_sno(varry sc.sno%type) is select grade from sc where sno=varry;
begin
vsno:=&v_input;
open v_sno(vsno);
loop
fetch v_sno into v_grade;
exit when v_sno%notfound;
dbms_output.put_line(v_grade);
end loop;
close v_sno;
end;
3. 有这么一张表t_t,他只有一个number(8)的字段a,由于在创建表时忘记设置主键约束,导致表中有很多重复的记录。请你编写一个程序,利用游标技术将表中重复的记录保留一个,删除其余的。
create table t_t(a number(8));
insert into t_t values(1);
insert into t_t values(3);
insert into t_t values(6);
insert into t_t values(1);
insert into t_t values(6);
insert into t_t values(5);
insert into t_t values(3);
insert into t_t values(1);
insert into t_t values(1);
set serveroutput on
declare
xx t_t.a%type;
temp2 t_t.a%type;
cursor v_a is select A from t_t;
cursor v_aa(temp t_t.a%type) is select A from t_t where A=temp for update of A nowait;
begin
open v_a;
loop fetch v_a into xx;
exit when v_a%notfound;
open v_aa(xx);
fetch v_aa into temp2; //向后走一个记录,如果没有这条语句,所有的记录就回被清空。有这条语句,那么会保留跳过的这条记录,而只删除后面的那些重复的记录。
loop fetch v_aa into temp2;
exit when v_aa%notfound;
delete from t_t where current of v_aa;
end loop;
close v_aa;
end loop;
close v_a;
end;
此题解方法采用两个游标,外游标v_a从t_t中读取所有数据信息,然后从v_a中提取信息,后根据提取的信息从v_aa中打开,v_aa是查找信息为temp的数据,然后将信息存储到v_aa中,此时我们只需在游标v_aa中删除重复的信息(注意:第一条信息以后的信息都为重复信息,需删除。)这样此题得到解决。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27042095/viewspace-739593/ ,如需转载,请注明出处,否则将追究法律责任。