Oracle 游标

1、概念

    游标是指向SQL处理的内存区的句柄或指针。当使用一个PL/SQL块来执行DML语句或只返回一行结果的SELECT语句时,系统将自动创建一个隐式游标。如果SQL语句返回多个结果,就必须创建一个显示游标

--游标的属性
--(1)cur_name%rowcount  :指出处理的行数
-- (2) cur_name%found     :处理了一行或多行返回TRUE否则FALSE 如 WHILE CUR%FOUND中
--(3)cur_name%notfound  :如果没有处理行返回TRUE,否则FALSE 如 EXIT WHEN CUR%NOTFOUND
--(4)cur_name%isopen    :如果处理之后不关闭游标,则为TRUE,关闭后为FALSE。发生在隐式游标中时
--   总是为FALSE;

2、隐式游标例程

隐式游标,系统自动声明,自动打开,自动使用并且自动关闭。
declare
    tname student.name%type;
    tage  student.age%type;
begin
    select name,age into tname,tage from
        student where id=‘S001‘;
        --如果返回多行,或零行,执行将报错。
    dbms_output.put_line(‘姓名=‘||tname||‘  年龄=‘||tage);
end;

3、显示游标

3.1、定义游标

--  定义游标(1)
--  CURSOR cursor_name IS select_statement;
cursor c_stu is select * from student;
---------------------------------------------------------------------------------------

--  定义系统游标(2) ,使用参照3
--  cursor_name SYS_REFCURSOR;系统游标
c_stu sys_refcursor;
---------------------------------------------------------------------------------------

--定义游标(3)
--先在包中定义游标,及用于检索的结构体,
--这里的结构体相当于  游标%rowtype
create or replace package p_stu
as
     type c_stu is ref cursor;
     type rc_stu is record
     (
         name student.name%type,
         age  student.age%type
     );
end;

--使用包中的游标
declare
    c_student p_stu.c_stu;
    crw_stu   p_stu.rc_stu;
begin
    open c_student for select name,age from student;
    loop
        fetch c_student into crw_stu;
        exit when c_student%notfound;
        dbms_output.put_line(‘姓名=‘||crw_stu.name||‘  年龄=‘||crw_stu.age);    

    end loop;
end;

3.2、一些使用游标的例子

--使用 FOR 循环遍历游标,不需要明确打开和关闭游标

declare
    --定义一个游标
    cursor c_stu is
        select name,age from student;
    --定义一个游标变量
    cw_stu c_stu%rowtype;
begin
    --使用for循环来使用这个游标
    for cw_stu in c_stu loop
        dbms_output.put_line(‘姓名=‘||cw_stu.name||‘ 年龄=‘||cw_stu.age);
    end loop;
end;
--使用 fetch 游标 必须明确打开和关闭游标

declare
    --定义一个游标
    cursor c_stu is
        select name,age from student;
    --定义一个游标变量
    cw_stu c_stu%rowtype;
begin
    --明确打开游标
    open c_stu;
    loop
        --提取一行数据到cw_stu
        fetch c_stu into cw_stu;
        --判读是否提取到值,没取到值就退出
        --取到值c_stu%notfound 是false
        --取不到值c_stu%notfound 是true
        exit when c_stu%notfound;
        dbms_output.put_line(‘姓名=‘||cw_stu.name||‘ 年龄=‘||cw_stu.age);
    end loop;
    --明确关闭游标
    close c_stu;
end;
--使用 while fetch 遍历数据  %found属性

declare
    --定义一个游标
    cursor c_stu is
        select name,age from student;
    --定义一个游标变量
    cw_stu c_stu%rowtype;
begin
    open c_stu;  --明确打开游标
    fetch c_stu into cw_stu; --填充第一行数据,以便WHILE条件检索
    while c_stu%found loop
        dbms_output.put_line(‘姓名=‘||cw_stu.name||‘ 年龄=‘||cw_stu.age);
        fetch c_stu into cw_stu;  --每次检索前都需要填充数据
    end loop;
    close c_stu;  --明确关闭游标
end;
--带参游标
declare
    cursor c(sSal emp.sal%type, sEmpno emp.empno%type)
    is
    select * from emp where sal >= sSal and empno > sEmpno;
begin
    for record_data in c(2500, 6666) loop
        dbms_output.put_line(record_data.ename);
    end loop;
end;

3.3、在存储过程中返回游标

--  注意:在declare块中使用存储过程返回的游标时:
-- (1)不能定义系统游标变量,编译错误。如:cw_Stu C_Stu%rowtype;
-- (2)可以使用结构体变量,但不能使用for循环如:for rw_stu in c_stu loop
--     将提示 c_stu ‘不是过程或尚未定义‘。
--  (3)游标不可显示打开或关闭,如 open c_stu;表达式类型错误。
时间: 2024-03-22 12:09:05

Oracle 游标的相关文章

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

Duang!危险的oracle游标

1.引言 SQL是面向集合的语言,其结果一般是集合量(含多条记录),而pl/sql的变量是标量,一组变量一次只能存放一条记录.很多时候查询结果的记录数是不确定的,无法提前声明足够的变量.于是引入了游标的概念,游标使得数据库操作更灵活,但同时也给黑客入侵数据库带来了机会.安华金和数据库安全实验室(DBSec Labs)基于游标的应用原理,本文讨论游标可能带来什么安全隐患以及如何应对这些安全隐患. 2.游标的分类 oracle数据库游标是Pl/sql执行DQL.DML等语句的时候,oracle在内存

oracle 游标例子

CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) /*********************************************************** * 功能:WAP指标--活跃用户统计(分批提交) * 参数:RETCODE(返回编码:0000成功) * 作者: * 创建时间:2013-01-16 * 版本:1.0 * 修改人: * 修改时间: ********************

【翻译】Oracle游标详细说明

这篇文章是选取官方文档的部分章节翻译过来的,去除了原文中的例子,并在结尾补充了几个例子.有兴趣的朋友可以点击文章末尾的连接去阅读官方文档. 一.游标的定义 游标是指向专用SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息.本章解释的游标是会话游标.会话游标存在于会话中直到会话结束.由PL/SQL创建和管理的游标称为隐式游标,由用户创建和管理的游标称为显式游标.你可以通过游标的属性获取任意会话游标的相关信息.通过查询动态性能视图V$OPEN_CURSOR,可以列出当前已经打开和

Oracle游标—for、loop、if结合应用

一.需求 什么时候会用到Oracle游标,以及其中的for.loop.if呢? 先看这样一个需求: 有一张学生授课表T_TEACHING,每个学生都有数门课程: 主键ID(自增) 课程号COURSE_ID 学号USER_ID 1 01 201501 2 02 201501 3 03 201501 4 01 201502 5 01 201503 6 01 201504 7 02 201504 ... ... ... 但是因为某些原因,导致有的学生课程不全(本应该每个学生都有3门课),应该如何把不全

Oracle游标循环更新数据案例

declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZJZJRQ AS ZJZJZJRQ FROM XTXMXX XT, QJGLXX_ZQL_MID QJ WHERE XT.XTXMBH = QJ.XTXMBH AND XT.XTXMCLRQ >= '20120630' AND (QJ.ZJQHZJRQ IS NULL OR QJ.ZJZJZJRQ

oracle游标小试

有时候需要大面积的修改数据,这个时候用循环语句效率不高.而临时表又不能满足点对点修改的时候,游标似一种不错的选择(PS:好像游标也是为循环而生的吧) 现在有两张表 t1(ryid number,name nvarchar2(50),salary number,paydate date……)用来存员工每月的工资 t2(ryid number,paySalary number)每个月发的工资数目 现将t2中的paySalary添加到t1中 可以直接用update来实现: 现用oracle的for游标

Oracle 游标示例,带异常处理

Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ FROM T_GUOS_ZXXX WHERE gxsj > begin_gxsj; c_row c_dl%ROWTYPE; BEGIN FOR c_row IN c_dl LOOP BEGIN IF (c_row.GXSJ > max_gxsj) THEN BEGIN max_gxsj := c_r

Oracle游标-循环查询表中数据(表名),并执行

Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount varchar2(100); --定义一个游标变量 cursor c_job is --查询该表中的所有表名 select tablename from tbname; c_row c_job%rowtype; begin --循环待处理数据,即以上查出的结果集 for c_row in c_job loop ---执行语句 from

oracle 游标 学习

1,什么是游标? ①从表中检索出结果集,从中每次指向一条记录进行交互的机制. ②关系数据库中的操作是在完整的行集合上执行的.  由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.  应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的. 这些应用程序需要一种机制来一次处理一行或连续的几行.而游标是对提供这一机制的结果集的扩展. 游标是通过游标库来实现的.游标库是常常作为数据库系统或数据访问 API