游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据。由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标。游标可以看做是指向记录集合的指针,他可以在集合记录中移动以访问每条记录的功能。

显示游标的使用:

创建游标

CURSOR cursor_name IS sql_statement;

游标一旦创建成功,Oracle会为其分配内存,并与定义的SQL关联起来。

打开游标

OPEN cursor_name [argument,。。。];

获取数据

FETCH cusrsor_name INTO variblep[,varible];

①执行上述指令时,只能获取记录集合中的一行记录,将这行记录放入随后的变量中,这些变量的数据类型必须与记录中每列的数据类型相同。

关闭游标

CLOSE cursor_name

游标的属性

%ISOPEN:判断游标是否打开

%FOUND:游标是否发现数据

%NOTFOUND:游标没有发现数据

%ROWCOUNT:游标可以遍历的记录数量

访问游标属性的方法: cursor_name.attribute_name

游标使用实例:

DECLARE

var1 VARCHAR2(20);--变量的声明

var2 VARCHAR2(20);

CURSOR cursor_name IS SELECT * FROM table_name;--创建游标

BEGIN

OPEN cursor_name; --打开游标

LOOP  --循环

FETCH cursor_name INTO var1,var2; --遍历游标 ***

dbms_output.put_line('bianlaing'||var1||'=='||var2);

EXIT WHEN cursor_name%NOTFOUND; --判断是否有数据

END LOOP; --循环结束

CLOSE cursor_name; --关闭游标

END;

①的解释var1 和 var2 必须和table_name表遍历结果集的数据类型分别对应

隐式游标的使用:

隐式游标是没有声明的游标,没有显示的创建游标只是在PLSQL代码块中执行SQL语句,这些语句就是隐式游标。

DECLARE

names VARCHAR2(10);

BEGIN

SELECT count(first_name) INTO names FROM emp;

dbms_output.put_line('count:='||names);

(这就是隐式游标)

END;

在用户每次运行select或者DML操作时,PLSQL会自动创建一个隐式游标,隐式游标无法控制,一旦涉及的SQL语句结束,隐式游标也会自动关闭。想要获得游标信息可以通过隐式游标的属性。

隐式游标的属性

SQL%ISOPEN:判断游标是否打开

SQL%FOUND:游标是否发现数据

SQL%NOTFOUND:游标没有发现数据

(该属性对于PLSQL的select into 语句没有用处,PLSQL认为其是一个非法操作,因为如果发生select into没有数据返回的情况,将会触发一个预定义异常NO_DATA_FOUND)

SQL%ROWCOUNT:用于发现游标中涉及的返回结果行的数量。

FOR游标

使用for游标不需要使用变量,也不需要显示的打开和关闭游标,这些是自动执行的,也不需要去fetch游标。

DECLARE

CURSOR cursor_nameIS SELECT * FROM table_name;--声明游标

BEGIN

FOR cursor_record IN cursor_name -for游标的使用

LOOP

dbms_output.put_line('变量'||cursor_record .chars||'=='||cursor_record .num);

END LOOP;

END;

For 游标语法中cursor_record 为一条记录的集合,他自动定义一个%ROWTYPE类型的变量,%ROWTYPE变量包含对应于记录中的多列变量,通过这个变量可以依次访问记录中的每个列值

游标表达式

Select deptno,dname,cursor(select empno,ename,sal from emp where deptno=d.deptno)from dept d;

游标变量/动态游标

像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行。游标变量显得更加灵活因为其声明并不绑定指定查询。

其主要运用于PLSQL函数或存储过程以及其他编程语言Java等程序之间作为参数传递。

不像游标的一点,游标变量没有参数。

游标变量具有以下属性:

(%FOUND, %NOTFOUND, %ISOPEN, and %ROWCOUNT)

1、声明格式:

DECLARE

TYPE ref_cursor_name IS REF CURSOR RETURN tablename%ROWTYPE;

游标变量又分为强类型strong(with a return type)和弱类型(with no return type):

TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE; -- 强类型

TYPE genericcurtyp IS REF CURSOR; -- 弱类型

my_cursor SYS_REFCURSOR; -- 使用预定义游标变量sys_refcursor

例子:

TYPE deptcurtyp IS REF CURSOR RETURN departments%ROWTYPE;
   dept_cv deptcurtyp; -- 声明游标变量

或是返回record类型:

DECLARE
   TYPE EmpRecTyp IS RECORD (
   employee_id NUMBER,
   last_name VARCHAR2(25),
   salary NUMBER(8,2));

--声明record
   TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;
   emp_cv EmpCurTyp;

使用游标变量最为参数传递

DECLARE

TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;

emp empcurtyp;

PROCEDURE process_emp_cv (emp_cv IN empcurtyp) IS  --参数类型为游标类型

person employees%ROWTYPE;

OPEN emp FOR SELECT * FROM employees WHERE ROWNUM < 11;

process_emp_cv(emp);

CLOSE emp;

在包中声明游标变量

CREATE PACKAGE emp_data AS

TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;

PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp);

END emp_data;

提取游标记录到集合类型

DECLARE

TYPE empcurtyp IS REF CURSOR;--声明动态游标

TYPE namelist IS TABLE OF employees.last_name%TYPE; --namelist集合

TYPE sallist IS TABLE OF employees.salary%TYPE;--sallist集合

emp_cv empcurtyp;

names namelist;--lsit -name

sals sallist;--list -sal

BEGIN

OPEN emp_cv FOR SELECT last_name, salary FROM employees

WHERE job_id = 'SA_REP';

FETCH emp_cv BULK COLLECT INTO names, sals; --BULK COLLECT INTO 的使用

CLOSE emp_cv;

FOR i IN names.FIRST .. names.LAST

LOOP

DBMS_OUTPUT.PUT_LINE('Name = ' || names(i) || ', salary = ' || sals(i));

END LOOP;

END;

通过bulk collect减少loop处理的开销
采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。
可以在select into,fetch into,returning into语句使用bulk collect。
注意在使用bulk collect时,所有的into变量都必须是collections.

游标变量的使用限制

1、不能再包说明中声明游标变量;

2、不能用“=”运算符比较游标变量相等性、不等性及是否为空;

3、不能存储于表列中;

4、不能将游标变量存在于关联数组、嵌套表或数组;

5、游标和游标变量之前是不可互操作的!

PLSQL游标使用的更多相关文章

  1. PLSQL游标

    静态游标:结果集已经确实(静态定义)的游标.分为隐式和显式游标 隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息: 显式游标:用户显式声明的游标,即指定结果集.当查询返回结果 ...

  2. SQL记录-PLSQL游标

    PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...

  3. Oracle PLSQL游标、游标变量的使用

    参考文章:https://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实 ...

  4. PLSQL开发笔记和小结(转载)

    *****************************************   PLSQL基本结构 ***************************************** 基本数据 ...

  5. Oracle之PLSQL总结

    基本数据类型变量 1. 基本数据类型     Number 数字型     Int 整数型     Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号 ...

  6. PLSQL开发笔记和小结

    *****************************************  PLSQL基本结构*****************************************基本数据类型变 ...

  7. PLSQL学习教程(全)

    基于ORACLE9i+PL/SQLDeveloper7.1.4) 课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名 ...

  8. plsql oracle 使用教程

    课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名ALIASES 5.连接列 6.在SQL PLUS中编辑缓冲,修改 ...

  9. Oracle存储过程、游标、函数

    SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数 ...

随机推荐

  1. iOS KVC setValuesForKeysWithDictionary的使用

    Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property ac ...

  2. 改变Button文字和图片的位置

    button.imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth, 0, -labelWidth);button.titleEdgeInsets = UI ...

  3. 51nod1119(除法取模)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 题意:中文题诶- 思路:这题数据比较大直接暴力肯定是不 ...

  4. Git和Github的配合使用

    Git教程 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git 本地仓库详解  ...

  5. 关于java sort的几种实现方式(单纯排序,按照bean的某一个字段,按照bean的多个字段)

    最近的开发过程中遇到了,按照bean类中的多个字段进行排序的情况,借此机会把相关的排序做法,简单整理备份一下. 1.list的单纯排序 2.list元素为bean的情况,按照bean的某一个属性进行排 ...

  6. xlrd(开excel表格)

    打来表格 wb = xlrd.open_workbook('example.xlsx') 选择sheet sh=wb.sheet_by_index(序号) 表格的行数 sh.nrows 选取第m行第n ...

  7. 5.IP选路,动态选路

    1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统 ...

  8. 纯css三角形

    三角形原理: 盒子c内容width为0,height为0,盒子给一定宽度的border,分别为四边的border设置不同的颜色,则可以得到不同样式的三角形举个简单的栗子:CSS代码 .box1{ wi ...

  9. 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)

    This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...

  10. PHP 绘图技术

    1.图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,png ..... 区别: gif 图片压缩率高,但是只能显示256色,可能造成颜色的丢失,可以显示动画 jpg/jpeg 图片压缩 ...