oracle的游标

结果集:就是select查询之后返回的所有行数据的集合

游标的定义:
1.处理结果集的一种机制,它可以定位到结果集中的某一行,对数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据

2.为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针

3.在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。

一般复杂的存储过程,都会有游标的出现,用处主要
1.定位到结果集中的某一行
2.对当前位置的数据进行读写
3.对结果集中的数据单独操作,而不是整行执行相同的操作
4.是面向集合的数据库管理系统和面向行的程序设计之间的桥梁

游标的生命周期:声明游标,打开游标,读取游标,关闭游标,释放游标

一.显示游标
1.声明游标:划分存储区域,注意此时并没有执行select语句;
CURSOR 游标名(参数,列表) [返回值类型] IS select语句
2.打开游标:执行select语句,获取结果集存储到游标中,此时游标指向结果集头,而不是第一记录
Open 游标名(参数,列表);
3.提取记录:移动游标提取一条记录;
Fetch 游标名 into 临时记录或者属性类型变量
4.关闭游标:将游标放入缓冲池中,没有完全释放资源,可从新打开
Close 游标名

游标的属性4中
%notfound fetch是否提取到数据, 没有返回true 提到返回false
%found fetch是否提到数据,有true;没有提到false
%rowcount 已经提取到记录的条数
%isopen 布尔值 游标是否打开

fetch游标(使用时候必须明确打开和关闭)

  declare 
            Cursor mycur is select * from tb_user;
            //定义临时变量用来接收游标中的一行;也可以写成 myrow tb_user%rowtype;
            //基于游标定义记录变量,比声明记录类型变量要方便,不容易出错  
            myrow mycur%rowtype;
            
        begin 
            open mycur;
            fetch  mycur into myrow;
            dbms_output.put_line(myrow.project_Id||myrow.project_name);    
            close mycur;
        end;  

 DECLARE  
       CURSOR c4(dept_id NUMBER, j_id VARCHAR2) --1、声明游标,有参数没有返回值  
       IS  
          SELECT first_name f_name, hire_date FROM employees  
          WHERE department_id = dept_id AND job_id = j_id;  
      
        --基于游标定义记录变量,比声明记录类型变量要方便,不容易出错  
        v_emp_record c4%ROWTYPE;  
    BEGIN  
       OPEN c4(90, 'AD_VP');             --2、打开游标,传递参数值  
       LOOP  
          FETCH c4 INTO v_emp_record;    --3、提取游标fetch into  
          IF c4%FOUND THEN  
             DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'  
                                ||v_emp_record.hire_date);  
          ELSE  
             DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
             EXIT;  
          END IF;  
       END LOOP;  
       CLOSE c4;                         --4、关闭游标  
    END;  

for 循环游标
循环游标隐式打开游标,自动滚动获取一条记录,并且自动创建临时记录类型变量存储记录,完成后自动关闭游标
for 变量名 in 游标名
loop
数据处理语句
end loop;

declare 
    Cursor mycur is select * from tb_user;
begin 
//隐式的打开游标,自动获取一条记录和创建临时类型变量var;处理完自动关闭游标
    for  var in mycur 
   loop
         dbms_output.put_line(var.project_id);
      end loop;
end; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值