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(‘name= ‘||tname||‘age= ‘||tname);
end

3、显示游标

3.1、定义游标

--cursor cursor_name is select _statement;
cursor c_stu is select from student;

c_stu sys_refcursor;--系统游标
--定义游标(3)
--先在包中定义游标,及用于检索的结构体,
--这里的结构体相当于  游标%rowtype
create or replace package p_stu
as
type c_su 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(‘name= ‘||crw_stu.name||‘ age= ‘||crw_stu.age);
   end loop;
end;

游标使用案例

declare
 --定义一个游标
cursor c_stu is select name,age from student;
 --定义一个游标变量
cw_stu c_stu%rowtype;
begin
  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
       fetch c_stu into cw_stu;
       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 c_stu%found loop
    dbms_output.put_line(‘姓名=‘||cw_stu.name||‘ 年龄=‘||cw_stu.age);
  end loop
  close c_stu;
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;表达式类型错误。
create or replace procedure (
       CID in varchar2,
       Cur_Stu out sys_refcursor--不能定义系统变量
)as
begin
  open Cur_Stu for select name,age from student where ClassId=Id;
end ;
--  使用--  测试结果:-- (1)不能定义系统游标变量,编译错误。如:cw_Stu C_Stu%rowtype;-- (2)可以使用结构体变量,但不能使用for循环如:for rw_stu in c_stu loop--     将提示 c_stu ‘不是过程或尚未定义‘。--  (3)游标不可显示打开或关闭,如 open c_stu;表达式类型错误。
declare
    C_Stu Sys_RefCursor;
    type rec_stu is record(
         tname student.name%type;
         tage student.age%type
    );
    rw_stu rec_stu;
begin
  pro_syscur(‘C001‘,c_stu);
  loop
     --也可以写成  fetch c_stu into rw_stu.tname,rw_stu.tage;
     --或直接定义表字段类型变量
    fetch c_stu into rw_stu;
    exit when c_stu%notfound;
     dbms_output.put_line(‘姓名=‘||rw_stu.tname||‘ 年龄=‘||rw_stu.tage);
  end loop;
end

(1)返回自定义游标

--第一步,在包中定义游标,及用于遍历的结构体
create or replace package pack_stu
as
type c_pubsur is ref cursor;
type re_stu is record(
     tname student.name%type,
     tage student.age%type
);
num number;
end

--第二步,将存储过程的返回类型设为上面包中游标类型
create or replace procedure p_stu(
       cid in varchar2,c_s out pack_stu.c_pubsur
)as
begin
  open c_s for select name,age from student where classid=cid;
--第三步,使用游标,注意事项与系统游标一致。
end

declare
     c_stu pack_stu.c_pubsur;
     cw_stu pack_stu.re_stu;
begin
  p_stu(‘D001‘,c_stu);
  loop
    fetch c_stu into cw_stu;
    exit when c_stu%notfound;
    dbms_output.put_line(‘姓名=‘||cw_stu.tname||‘ 年龄=‘||cw_stu.tage);
  end loop
end
时间: 2024-10-26 15:23:45

Oracle游标整理二的相关文章

【翻译】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 游标变量ref cursor详解

oracle 游标变量ref cursor详解 分类: PL/SQL开发 2013-12-04 15:15 685人阅读 评论(0) 收藏 举报 oracleref cursor 一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言java等程序之间作为参数传递.     不像游标的一点,游标变量没有参数.     游标变量具有以下属性:     (

oracle 游标使用大全

转:http://www.cnblogs.com/fjfzhkb/archive/2007/09/12/891031.html oracle的游标和例子! 游标-----内存中的一块区域,存放的是select 的结果 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区.这个区包含了已经处理完的行数.指向被分析语句的指针,整个区是查询语句返回的数据行集.游

Oracle游标解析

本节对Oracle中的游标进行详细讲解. 本节所举实例来源Oracle中scott用户下的emp表dept表: 一.游标: 1.概念: 游标的本质是一个结果集resultset,主要用来临时存储从数据库中提取出来的数据块. 二.游标的分类: 1.显式游标:由用户定义,需要的操作:定义游标.打开游标.提取数据.关闭游标,主要用于对查询语句的处理. 属性:%FOUND        %NOTFOUND        %ISOPEN          %ROWCOUNT Example:打印emp表的

[转载]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数据库引航二——后台进程

from 谭怀远--数据库领航 后台进程 一.system monitor(SMON) (非正常关闭后的)实例恢复 二.process monitor(PMON) 回滚事务 释放锁及其它资源 重启死掉的调度器.(在共享服务器中用).分配用户连到哪个服务器上. 在监听器中注册服务信息 三.DBWn和LGWR DBWRn下写入磁盘文件 四.check point(CKPT) 喊DBWn写脏数据 完后会更新DATAFILE的HEADER和控制文件的HEADER.而HEADER中有同步所需要的信息,即C

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr