oracle游标的使用(二)
时间:2021-07-01 10:21:17
帮助过:26人阅读
- BEGIN
- UPDATE t_bjqk SET fBL = fBL - 2 WHERE fBJDM=‘1461‘;
- IF SQL%FOUND THEN
- dbms_output.put_line(‘这次更新了‘ || SQL%ROWCOUNT);
- ELSE
- dbms_output.put_line(‘一行也没有更新‘ );
- END IF;
- END;
[sql] view plain
copy
- 在select中有两个中比较常见的异常: 1. NO_DATA_FOUND 2. TOO_MANY_ROWS
- SQL> declare
- 2 sname1 student.sname%TYPE;
- 3 begin
- 4 select sname into sname1 from student;
- 5 if sql%found then
- 6 dbms_output.put_line(sql%rowcount);
- 7 else
- 8 dbms_output.put_line(‘没有找到数据‘);
- 9 end if;
- 10 exception
- 11 when too_many_rows then
- 12 dbms_output.put_line(‘查找的行记录多于1行‘);
- 13 when no_data_found then
- 14 dbms_output.put_line(‘未找到匹配的行‘);
- 15 end;
- 16 /
- 查找的行记录多于1行
- PL/SQL procedure successfully completed
-
- SQL>
显式游标:
sqlserver与oracle的不同之处在于: 最后sqlserver会deallocate 丢弃游标,而oracle只有前面四步: 声明游标、打开游标、使用游标读取记录、关闭游标。
显式游标的使用:
[sql] view plain
copy
- declare
- sname varchar2( 20);
- cursor student_cursor is select sname from student ;
- begin
- open student_cursor;
- fetch student_cursor into sname;
- while student_cursor%found
- loop
- dbms_output.put_line (‘学生姓名‘ ||sname );
- fetch student_cursor into sname;
- end loop;
- close student_cursor;
- end;
-
- declare
- sname student.sname%type;
- sno student.sno%type;
- cursor student_cursor (input_sno number) is
- select s.sname, s.sno from student s where s.sno > input_sno;
- begin
- sno := &请输入学号;
- open student_cursor( sno);
- fetch student_cursor into sname, sno;
- while student_cursor% found
- loop
- dbms_output.put_line (‘学号为:‘ ||sno ||‘姓名为:‘ ||sname );
- fetch student_cursor into sname,sno;
- end loop;
- close student_cursor;
- end;
-
-
- declare
- stu1 student%rowtype ;
- cursor student_cursor is select * from student ;
- begin
- open student_cursor;
- for stu1 in student_cursor
- loop
- dbms_output.put_line (‘学生学号:‘ ||stu1.sno ||‘学生姓名:‘ ||stu1.sname );
- fetch student_cursor into stu1;
- end loop;
- close student_cursor;
- end;
-
-
- declare
- stu1 student%rowtype ;
- cursor student_cursor is select * from student s where s.sno in (2 ,3 ) for update;
- begin
- open student_cursor;
- fetch student_cursor into stu1;
- while student_cursor%found
- loop
- update student set sage = sage + 10 where current of student_cursor;
- fetch student_cursor into stu1;
- end loop;
- close student_cursor;
- end;
-
-
- declare
- stu1 student%rowtype ;
- cursor student_cursor is select * from student s where s.sno in (2 ,3 ) for update;
- begin
- open student_cursor;
-
-
- 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;
-
-
- declare
- cursor my_cursor is select ename from emp where deptno= 10;
- type ename_table_type is table of varchar2 (10 );
- 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
- 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 <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
[sql] view plain
copy
- declare
- type ref_cursor is ref cursor;
- tab_cursor ref_cursor ;
- 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 ;
- 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;
-
-
- 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 );
- kc varchar2 (50 );
- type ref_cursor is ref cursor;
- stu_cursor ref_cursor ;
- type tab_type is table of number;
- tab_xh tab_type ;
- cursor cursor_xh is select distinct( xh) from student;
- begin
- open cursor_xh;
- fetch cursor_xh bulk collect into tab_xh;
- for i in 1 .. tab_xh.count
- loop
- kcs :=‘‘ ;
- open stu_cursor for select kc from student s where s.xh = tab_xh(i );
- fetch stu_cursor into kc ;
- while stu_cursor %found
- loop
- kcs := kc ||kcs ;
- fetch stu_cursor into kc ;
- end loop;
- insert into student2 (xh , kc ) values( i, kcs);
- close stu_cursor ;
- end loop;
- close cursor_xh ;
- end;
oracle游标的使用(二)
标签:input copy 显式游标 程序 郑州 current 加一列 when arc