游标的使用步骤
- 定义游标
- open游标
- fetch游标赋值给变量或集合
- close游标
游标的分类:
一。静态游标
1、隐式游标
系统帮我们定义好的游标。注意一句话,每当我们执行一个dml语句,系统就会自动帮助我们创建隐式游标。
例如,将孙丽的电话号码修改为 13818882888。
BEGIN UPDATE PERSON.PERSON SET PHONE=13818882888 WHERE NAME=‘孙丽‘; IF SQL%NOTFOUND THEN PRINT ‘此人不存在‘; ELSE PRINT ‘已修改‘; END IF; END; /
2、显式游标
我们自己定义的游标。
--静态显式游标: declare c1 cursor is select * from test; v_id int default 0; v_name varchar(50) DEFAULT null; begin open c1; repeat fetch next c1 into v_id, v_name; dbms_output.put(v_id); dbms_output.put(v_name); until c1%notfound; close c1; end;
--静态显式游标: declare c1 cursor return sysdba.test%rowtype is select * from sysdba.test; --这个游标在定义的时候指定了返回值类型必须是sysdba.test%rowtype v_test sysdba.test%rowtype; --这里定义了一个变量,变量的数据类型式sysdba.test%rowtype; begin open c1; repeat fetch next c1 into v_test; --游标从查询表达式select * from test取出来的值,是和v_test的数据类型一致的,所以可以赋值给v_test print v_test.id;
print v_test.name; until c1%notfound; close c1; end;
二。动态游标
区别不大,就两点区别,分别在定义游标和打开游标上。
定义游标时:不要接相关的查询表达式赋值给游标
open游标时:要接相关的查询表达式赋值给游标,并支持动态参数绑定。
三。游标变量
将游标作为一个变量,这里的游标是一个变量,什么意思呢?就是说他可以指向不同的查询表达式的内存区域地址(当时相同时间下是只能指向一个的)
游标变量和游标的区别主要是1.定义语法不同 2.open游标时才给游标赋值,如红色所示:
--游标变量: declare type c1_cursor_type is ref cursor return sysdba.test%rowtype; c1 c1_cursor_type; v_test sysdba.test%rowtype; begin open c1 for select * from test; repeat fetch next c1 into v_test; dbms_output.put(v_test); until c1%notfound; close c1; end;
--游标变量: declare type test_record is record(id test.id%TYPE, name test.name%TYPE); v_test test_record; type c1_cursor_type is ref cursor return test_record; c1 c1_cursor_type; begin open c1 for select * from test; repeat fetch next c1 into v_test; print v_test.ID; until c1%notfound; close c1; end;
%type和%rowtype学习可以参考这篇博客:
https://blog.csdn.net/yuzongtao/article/details/40708739