SQL程序设计—01—游标介绍


 

游标的使用步骤

  • 定义游标
  • open游标
  • fetch游标赋值给变量或集合
  • close游标

 

 

游标的分类:

一。静态游标

1、隐式游标

系统帮我们定义好的游标。注意一句话,每当我们执行一个dml语句,系统就会自动帮助我们创建隐式游标。

SQL程序设计—01—游标介绍

例如,将孙丽的电话号码修改为 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

上一篇:oracle的操作系统认证(connect as sysdba)登录方式


下一篇:DBA,SYSDBA,SYSOPER三者的区别