oracle 数据库游标用法详解

oracle 数据库教程游标用法详解

1、什么是游标

游标是一种PL/SQL控制结构,可以对SQL语句进行显示控制,便于对表的数据逐条进行处理

2、游标分类

显示游标: Declared and named by the programmer

隐式游标: Declared for all DML and PL/SQL SELECT statements

 

3、游标的属性:

%FOUND:Evaluates to TRUE if the most recent SQL statement affects one   or more rows

%NOTFOUND:和%FOUND相反

%ISOPEN:是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。

%ROWCOUNT:Number of records affected by the most recent SQL statement

 

注意:dbms_output.put_line();这个是不能打印boolean型的,解决方法

   if b then

 dbms_output.put_line('b=true');

end if;

 

或者:

declare

 b boolean;

begin

 b := true;

 dbms_output.put_line((case when b then 'true' else 'false' end));

end;

 

对于null,课先使用NVL()或者decode()处理

 

显示游标:需要手动open和close

例如:

DECLARE

CURSOR mycursor IS

SELECT * FROM dept;

myrecord dept%ROWTYPE;

BEGIN

OPEN mycursor;

FETCH mycursor INTO myrecord;

WHILE mycursor%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(myrecord.deptno||' '||myrecord.dname||'   '||myrecord.loc);

FETCH mycursor INTO myrecord;

END LOOP;

CLOSE mycursor;

END;

注意:在进行while循环前,必须先有一个FETCH..INTO操作,否者%FOUND总是返 回false

 

带参数的游标:

DECLARE

CURSOR mycursor(num varchar2) IS

SELECT * FROM DEPT WHERE deptno=num;

myrecord dept%ROWTYPE;

BEGIN

OPEN mycursor(10);

LOOP

FETCH mycursor INTO myrecord;

EXIT WHEN mycursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('deptNum='||myrecord.deptno||' deptName='||myrecord.dname);

END LOOP;

CLOSE mycursor;

END;

 

FOR循环操作游标

使用FOR循环读取游标时,不需要显示申明变量用于接收结果,也不需要手动打开和关闭游标,例如:

DECLARE

CURSOR mycursor(num varchar2) IS

SELECT * FROM DEPT WHERE deptno=num;

BEGIN

FOR cur IN mycursor(10) LOOP

DBMS_OUTPUT.PUT_LINE('deptNum='||cur.deptno||' deptName='||cur.dname);

END LOOP;

END;

 

注意:PL/SQL中参数只需要给出类型,不需要给出长度或精度。

当直接将游标的值读取到变量时,变量的个数应与游标指向的结果集的列数相同。例如结果集中有两个列,那么使用FETCH....INTO 时对应的变量个数也应该有两个。

DECLARE

d_no number;

d_name varchar2(10);

CURSOR mycursor(num varchar2) IS

SELECT deptno,dname FROM DEPT WHERE deptno=num;

BEGIN

OPEN mycursor(10);

FETCH mycursor INTO d_no,d_name;

LOOP

DBMS_OUTPUT.PUT_LINE(d_no||' '||d_name);

FETCH mycursor INTO d_no,d_name;

EXIT WHEN mycursor%NOTFOUND;

END LOOP;

CLOSE mycursor;

END;

/

 

%ROWCOUNT初始值为null,每当使用FETCH...INTO从游标中取出一条数据后,      ROWCOUNT的值加1,并不是标识结果集的行数。

例如:

DECLARE

d_name varchar2(10);

CURSOR mycursor IS

SELECT dname FROM DEPT;

BEGIN

OPEN mycursor;

LOOP

FETCH mycursor INTO d_name;

EXIT WHEN mycursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(mycursor%ROWCOUNT);

END LOOP;

CLOSE mycursor;

END;

结果集中有4行记录,输出结果为:1 2 3 4

 

可更新数据的游标

要想在使用游标的同时修改数据,需要在申明游标时加上FOR UPDATE关键字。

例如:

DECLARE

d_name VARCHAR2(20);

CURSOR mycursor IS

SELECT dname FROM dept FOR UPDATE;

BEGIN

OPEN mycursor;

LOOP

FETCH mycursor INTO d_name;

EXIT WHEN mycursor%NOTFOUND;

UPDATE dept SET dname=RTRIM(dname,'_t') WHERE CURRENT OF mycursor;

END LOOP;

CLOSE mycursor;

END;

CURRENT OF+游标名:获取游标当前所指向的行

RTRIM(dname,'_t'):LTRIM、RTRIM实现字符串过滤(不仅仅去除空格)

 

 

隐式游标:不使用DECLARE显示申明的游标。

例如:

BEGIN

FOR cur IN(SELECT dname FROM dept) LOOP

DBMS_OUTPUT.PUT_LINE(cur.dname);

END LOOP;

END;

 

1、含有参数的游标

declare
 cursor cur_my (mv number) is select * from Person where no<mv;
begin
  for tem in cur_my(4) loop
  DBMS_OUTPUT.put_line('name:'||tem.name);
  end loop;
end;

2、设置引用游标
declare
   temp_row Person%rowtype;
   type my_type is ref cursor;
   cur_my my_type;
begin
   open cur_my for 'select * from Person ';
   loop
      fetch cur_my into temp_row;
      exit when cur_my%notfound;
      DBMS_OUTPUT.put_line('name:'||temp_row.name);
   end loop;
   close cur_my;
end;

3、for loop循环游标

DECLARE
    v_id Integer;
    v_name varchar2(50);
    v_age Integer;
    cursor cur_mycursor is select id,name,age from Users;
BEGIN
    for temp in cur_mycursor loop
       v_id :=temp.id;
       v_name :=temp.name;
       v_age :=temp.age;
       dbms_output.put_line('id:'||v_id||'name:'||v_name||'age:'||v_age);
    end loop;
    /**dbms_output.put_line('所有记录数:'||cur_mycursor%rowcount||'条!');*/
END;

4、标准化loop循环游标

DECLARE
    v_id Integer;
    v_name varchar2(50);
    v_age Integer;
    cursor cur_mycursors is select id,name,age from Users;
BEGIN
     OPEN cur_mycursors;
       dbms_output.put_line('所有记录数:'||cur_mycursors%rowcount||'条!');
     LOOP
       FETCH cur_mycursors INTO v_id,v_name,v_age;
       dbms_output.put_line('id:'||v_id||'name:'||v_name||'age:'||v_age);
       IF  cur_mycursors%NOTFOUND THEN
            EXIT;
       END IF;
     END LOOP;
     dbms_output.put_line('所有记录数:'||cur_mycursors%rowcount||'条!');
     CLOSE cur_mycursors;
END;

时间: 2024-11-05 06:21:10

oracle 数据库游标用法详解的相关文章

oracle数据库xml数据类型详解

Oracle 的 XML 实现? Oracle 已经通过数据库教程的 XML DB 组件实现了 XML,该组件是企业版和标准版的标准特性.通过数据库配置助手 (DBCA) 或者运行一个目录脚本 catqm.sql,可以轻松安装 Oracle XML DB.XML DB 产品提供本文讨论的所有特性. 要验证是否安装了 XML DB,只需运行下面的 SQL: select comp_name from dba_registry where comp_name like ''%XML%''; COMP

oracle数据库备份图文详解

config NBU备份数据库 nbu安装 环境: database:oracle 11.2.3 OS:oracle linux 5.7 X86_64 backupsoftware:NBU 7.5 tape library:mhvtl-utils-1.4 在生产环境中一般使用的真实的带库,或者厂商提供的虚拟带库. But 在学习的过程中没有那么多的银子去买设备,那么只有用虚拟机来做虚拟带库了. 这是NBU 备份oracle 数据库的第一步. 配置虚拟带库 首先到如下网址(如果您说我贴的网址打不开

Oracle数据库审计功能详解

一.审计分类: Oracle中审计总体上可分为"标准审计"和"细粒度审计"后者也称为"基于政策的审计",在Oracle10G之后功能得到很大增强.其中标准审计可分为用户级审计和系统级审计.用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作.系统级审计只能由DBA设置,用以监测成功或失败的登录要求.监测GRANT和REVO

Oracle数据库QUIESCE状态详解

数据库的这三种状态有相似之处,这里简单总结一下. 这一篇介绍QUIESCE状态. RESTRICT .QUIESCE和SUSPEND(一): 当数据库处于QUIESCE状态时,只有DBA会话可以进行操作,而普通会话会处于等待状态,只有当数 据库退出QUIESCE状态,普通会话才能继续操作. QUIESCE 似乎和RESTRICT很相似,都是修改数据库的状态,使得DBA用户可以进行管理操作,避免非 DBA用户同时访问.但是二者还是有明显的区别的.首先RESTRICT是禁止普通用户登陆,而对已经登陆

Unix环境下Oracle数据库完全优化详解

如今的优化己经向优化等待(waits)转型了,实际中性能优化最根本的出现点也都集中在IO,这是影响性能最主要的方面,由系统中的等待去发现Oracle库中的不足.操作系统某些资源利用的不合理是一个比较好的办法,本文测重于Unix环境. 一.通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲这也可能不是一个正常的状态,因为CPU可能正等待IO的完成.除此之外我们还应观注那些占用系统资源(CPU.内存)的进程. 1

oracle instr()函数用法详解

语法  代码如下 复制代码 instr( string1, string2 [, start_position [, nth_appearance ] ] ) string1是要搜索的字符串. string2为string1中搜索子串. start_position是string1中搜索将开始的位置.此参数是可选.如果省略,则默认为1.字符串中的第一个位置是1.如果start_position是负数,函数从string1的开始搜索字符串,然后对结束计数的字符数start_position. nt

卸载Oracle数据库的步骤详解

  下面就让我们一起来将Oracle删除干净,为重装做好准备. 1.删除服务命令 具体操作方法是:开始--运行--cmd,进入cmd命令行 然后输入: sc delete 服务名 例如: sc delete serv-u 服务器 查询服务输入命令:sc query 服务名 例如:sc query OracleServiceORCL 2.删除oracle注册表信息 cmd命令行输入:regedit (1)选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入

oracle to_char()函数用法详解

TO_CHAR函数的Oracle / PLSQL,数字或日期转换为一个字符串. to_char函数的语法是: to_char( value, [ format_mask ], [ nls_language ] ) 值可以是数字或日期将被转换为一个字符串. format_mask是可选的.这是将要使用的格式转换成一个字符串值. NLS_LANGUAGE是可选的.这是免入息审查贷款计划的语言,用于转换为字符串的值. Applies To:  代码如下 复制代码 Oracle 8i, Oracle 9

Oracle Merge Into 用法详解

原文:http://blog.csdn.net/EdgenHuang/article/details/3587912 Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表. Oracle 10g中MERGE有如下一些改进: UPDATE或INSERT子句是可选的 UPDATE和INSERT子句可以加WHERE子句 ON条件中使用常量过滤谓词来