Simple PL/SQL 对游标的理解
前提
我有这么一张残念的表。我屮艸芔茻,截屏的时候把鼠标截进来了。
游标
类似于c的指针,c++中vector的迭代器(iterator)。类似于for语句中的i。
- %found 影响一行以上为true,否则为false
- %notfound 与第一条值相反
- %isopen 是否打开
- %rowcount 返回受影响的行数
隐式游标
样例1
|
|
样例2
与for语句搭配
1234567891011 set serveroutput ondeclarecourse_row course%rowtype;beginfor course_row in (select * from course)loopdbms_output.put('课程名:'||course_row.cname);dbms_output.put_line(' 课程编号:'||course_row.cid);end loop;end;/
问题
为什么不行?
12345678910111213 set serveroutput ondeclaretype course_table is table of course%rowtype;course_row course_table;beginselect * into course_row from course;if sql%notfound thendbms_output.put_line('没有记录');elsedbms_output.put_line('有'||sql%rowcount||'条记录');end if;end;/
显示游标
声明语法
12 CURSOR cursor_name [(parameter[,parameter]...)][return return_type] IS select_statement;打开和关闭
12 open cursor_name;close cursor_name;
样例
fetch语句自动会返回下一个游标的地址。
12345678910111213141516 set serveroutput ondeclareCURSOR course_cursor(ID in number default 1)is select * from course where cid>=ID;course_row course%rowtype;beginopen course_cursor(3);loopfetch course_cursor into course_row;exit when course_cursor%notfound;dbms_output.put('课程名:'||course_row.cname);dbms_output.put_line(' 课程编号:'||course_row.cid);end loop;close course_cursor;end;/
与for语句搭配自动开关游标,不需要主动声明。
123456789101112 set serveroutput ondeclareCURSOR course_cursoris select * from course;beginfor r in course_cursorloopdbms_output.put('课程名:'||r.cname);dbms_output.put_line(' 课程编号:'||r.cid);end loop;end;/