oracle中的游标的原理和使用详解(二)

2015-01-21 11:11:12 · 作者: · 浏览: 105
t_cursor; -- fetch student_cursor into stu1;--移动游标 -- while student_cursor%found--遍历游标,判断是否指向某个值 loop fetch student_cursor into stu1 ;--移动游标 exit when student_cursor %notfound ; update student set sage = sage + 10 where current of student_cursor;--通过游标中的信息更新数据 end loop; close student_cursor; end; ------------------------------------使用fetch ... bulk collect into------------------------------- declare cursor my_cursor is select ename from emp where deptno= 10; --声明游标 type ename_table_type is table of varchar2 (10 );--定义一种表类型,表中的属性列为varchar2类型 ename_table ename_table_type;--通过上面定义的类型来定义变量 begin open my_cursor; --打开游标 fetch my_cursor bulk collect into ename_table; --移动游标 for i in 1 ..ename_table.count loop dbms_output.put_line(ename_table(i)); end loop ; close my_cursor; end; -----------------------------------显示游标题目-------------------------------------- SQL > select * from student ; XH XM ---------- ---------- 1 A 2 B 3 C 4 D SQL > select * from address ; XH ZZ ---------- ---------- 2 郑州 1 开封 3 洛阳 4 新乡 完成的任务 :给表student添加一列zz ,是varchar2 (10 )类型; 再从address中,将zz字段的数值取出来,对应的插入到 student新增的zz列中。 即:得到的结果:student表中,是: XH XM ZZ -- ---------- ------ 1 A 开封 2 B 郑州 3 C 洛阳 4 D 新乡 declare stu1 student %rowtype ; add1 address %rowtype ; cursor student_cursor is select * from student for update;--声明更新游标 cursor address_cursor is select * from address ;--声明游标 begin open student_cursor ;--打开游标 fetch student_cursor into stu1;--移动游标 while student_cursor% found--判断游标是否指向某条记录 loop open address_cursor ;--打开另外一个游标 fetch address_cursor into add1 ;--移动游标 while address_cursor %found--判断游标是否指向某条记录 loop if add1.xh = stu1.xh then--判断两个游标所指向的记录中xh的值是否相等 update student s set s.zz = add1.zz where current of student_cursor;--假如相等就更新游标所指向的记录值 end if; fetch address_cursor into add1 ;--移动游标 end loop; close address_cursor ;--关闭游标 fetch student_cursor into stu1 ;--移动游标 end loop; close student_cursor ;--关闭游标 end;

?



REF游标也叫动态游标:
qREF 游标和游标变量用于处理运行时动态执行的 SQL 查询 q创建游标变量需要两个步骤: q声明 REF 游标类型 q声明 REF 游标类型的变量 q用于声明 REF 游标类型的语法为:

TYPE IS REF CURSOR

[RETURN ];

-----------------------------------ref游标---------------------------------
declare
type ref_cursor  is ref cursor; --声明一个ref游标类型
tab_cursor ref_cursor ;--声明一个ref游标
sname student.xm %type ;
sno student.xh %type ;
tab_name varchar2 (20 );
begin
  tab_name := '&tab_name'; --接收客户输入的表明
  if tab_name = 'student' then
    open tab_cursor for select xh ,xm  from student ; --打开ref游标
    fetch tab_cursor into sno ,sname ;--移动游标
    while tab_cursor %found
      loop
        dbms_output.put_line ('学号:' ||sno ||'姓名:' ||sname );
        fetch tab_cursor into sno ,sname ;
        end loop;
        close tab_cursor ;
        else
          dbms_output.put_line ('没有找到你想要找的表数据信息' );
          end if;
        end;

 
-----------------------------------ref游标题目---------------------------------
SQL > select * from student ;
        XH KC
---------- ----------
         1 语文
         1 数学
         1 英语
         1 历史
         2 语文
         2 数学
         2 英语
         3 语文
         3 英语
9 rows selected

SQL >       
完成的任务 :
生成student2表 (xh number, kc  varchar2 (50 ));
对应于每一个学生,求出他的总的选课记录,把每个学生的选课记录插入到student2表中。
即,student2中的结果如下:
                      XH KC
                 --- -------------------------------------------
                       1 语文数学英语历史
                       2 语文数学英语
                       3 语文英语

create table student2 (xh number, kc varchar2 (50 ));

declare
kcs varchar2 (50