Oracle-35-隐式游标&显式游标

一、游标作用(或定义)

1.PL/SQL提供游标机制处理多行记录结果集;

2.游标类似于指针,使应用程序一次可以处理其中的一行记录,比如将游标放入一个for循环中,每循环一次就处理一行记录,那么循环n次就可以处理n行记录

3.Oracle中,可以分为显式游标和隐式游标两种,比如select*fromstudent就是用隐式游标进行遍历student表,然后将查询结果展示;

4.在平常在进行SELECT查询、DML操作Oracle都会自动创建声明“隐式游标”来处理结果数据;

6.如果需要完成特定功能(SELECT、DML操作),则可以由PL/SQL程序来自定义一个“显式游标”。

二、隐式游标

在执行一个SQL语句时,Oracle服务器将自动创建一个隐式游标。这个游标存储执行SQL语句的结果。

1.游标的主要属性(隐式和显式皆可):

(1)%FOUND:布尔型属性,如果SQL语句至少影响一行操作,则返回TRUE,否则为FALSE;

比如如下程序:

declare

a emp%rowtype;——a变量的数据类型是emp表中的行,便于后面将emp表一行数据存入a中

begin

select* into a from emp where empno = 7935;

if sql%found then——用隐式游标判断上一行的数据是否存在

dbms_output.put_line(‘员工编号为7935的员工存在,其名字为‘ ||a.ename);

end if;

end;

例1:练习游标%found属性

解:注意下图中的程序:

如果在where子句中输入一个不存在的学号’h001’,其余代码同上,会报错,提示数据找不到:

上述报错可用exception解决,注意下图中的程序:

(2)%NOTFOUND:布尔型属性,与%FOUND的功能相反;

(3)%ISOPEN:布尔型属性,当游标已打开时返回TRUE,游标关闭时为FALSE;

(4)%ROWCOUNT:数字型属性,返回受SQL语句影响的行数。

例2:练习游标%rowcount属性。

解:当前student表中数据,注意’s015’行其余数据为null:

现在用游标%rowcount属性更新数据:

然后我们查询当前student表,发现’s015’行数据已经更新:

所以说通过游标的%rowcount属性可以查看update数据之后,原student表中受其影响的行数,其余增删改查同理可用%rowcount查询。

2.隐式游标需要注意的地方

(1)PL/SQL中使用select语句,必须和into关键字一起使用;

(2)PL/SQL中select只返回一行数据,如果超过一行数据,那就要使用显式游标;

(3)对于select into语句,如果执行成功,sql%rowcount的值为1,如果没有成功,sql%rowcount的值为0且产生一个异常NO_DATA_FOUND;

 

3.【特别注意】

无论用游标哪种属性,记得格式:游标名%属性,比如隐式游标sql%found,再比如显式游标cursor_name%found。

三、显式游标

当查询结果返回多于一行时,必须使用显式游标。使用显式游标

的4个步骤:

Step1:声明显式游标;

Step2:打开显式游标;

Step3:检索显式数据;

Step4:关闭显式游标。

1.声明显式游标的语法格式

cursor 显式游标名 [(parameter[,parameter…])] [return return_type] is
查询语句

其中parameter为显式游标的输入参数,它可以让用户在打开显式游标时,向显式游标传递值,parameter格式:

参数名 [in]
参数数据类型 [{:= | default} expresson]

2.打开显式游标格式

open 显式游标名 (‘张三’);

3.关闭游标格式

close 显式游标名

注意在使用完游标后切记关闭游标。

 

4.利用显式游标检索数据,在检索数据时使用fetch语句找出结果集中的单行,并从中提取单个值传递给变量。做法是用一个loop循环,把fetch丢进去,比如:

loop

fetch emp_cursorinto a;——利用fetch语句将游标emp_cursor的值传递给变量a

end loop;

例3:练习显式游标

解:注意下图中的程序:

程序分段解析:

declare

cursor v_cur(m in varchar2)——声明显式游标,注意不要指定参数m的长度

is select sno,sname from student wheresno=m;——将参数m值给sno,之后select语句据此筛选出符合条件的数据

type t_record is record(——定义记录,便于之后用fetch语句将游标内数据传入变量中

id varchar2(20),

name varchar2(20)

);

t t_record;——定义相对于记录t_record的变量t,

begin

open v_cur(‘s001’);——开启显式游标

loop

fetch v_cur into t;——用fetch语句将游标内数据传入变量中

exit when v_cur%notfound;——定义跳出循环条件,即游标内没

数据时

dbms_output.put_line(t.id || ‘  ‘ || t.name);

end loop;

close v_cur;——关闭显式游标

end;

【总结】

(1)无论是隐式还是显式游标,都有属性:

%found, %notfound, %isopen,%rowcount;

(2)隐式游标只能操作单行数据,多行数据必须用显式游标;

(3)隐式游标名称固定sql,显式游标名称要自定义;

(4)显式游标要通过fetch语句将游标中的值传递给变量,通常把该fetch语句放入loop循环,记得循环中要定义跳出循环条件;

(5)在使用显式游标时,cursor
游标名(参数名 in 参数数据类型),这种方式定义时,参数数据类型中不要指定长度,否则报错,
比如cursor v_cur (m in varchar2(20))是错的,必须不指定长度,即cursor v_cur (m in varchar2)

时间: 2024-10-24 02:15:39

Oracle-35-隐式游标&显式游标的相关文章

android之intent显式,显式学习

intent,意图 当从一个Activity到另一个Activity时调用,这里重点学习显式,隐式的使用 使用语句上的区别: 隐式意图:                 显式意图: setAction                                            跳转到其他应用:setClassName setData 跳转到自己应用:setClass addCategory(当为DEFAULT时可无) 一.无参时的显式.隐式举例 显式-到自己应用(最简单情况): /*

Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字.当这个应用程序运行时,也就是它的可执行文件

c# implicit explicit关键字(隐式和显式数据类型转换)

implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_type ( source_type identifier ){......}隐式转换可以通过消除不必要的类型转换来提高源代码的可读性.但是,因为可以在未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果. 一般情况下,隐式转换运算符应当从不引发异常并且从不丢失信息,以便可以在不知晓的情况下安全使

C#接口的隐式和显式实现

1:当类实现一个接口是,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性 2:当类实现多个接口且接口包含相同的方法签名,此时使用显式接口实现.(标示出哪个接口属于哪个方法) 3:隐式接口实现:类和接口都可以访问接口中的方法 4:显式接口实现:只能通过接口访问. 举例如下: ①隐式 1 interface Animal 2 3 { 4 5 void Speak(); 6 7 } 8 9 class Dog:Animal 10 { 11 public void Speak()

安卓突击:隐式、显式Intent

android当中显式intent和隐式intent的区别 定义: Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图.作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端. 显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent. 隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent. 说明:Android系统使用IntentFilter 来寻找与隐式Intent

AngularJS中的隐式和显式依赖注入

在之前学习AngularJS的过程中,都是用到了显式依赖注入,比如: <script type="text/javascript"> angular.module('app', []) .controller('Controller1', function($scope) { $scope.something = 'hello world'; }); </script> 依赖注入$scope.这么写有个弊端,在发布的时候,往往要压缩JavaScript代码,压缩

IOS动画隐式,显式,翻页

//  ViewController.m //  IOS动画0817 // //  Created by 张艳锋 on 15/8/17. //  Copyright (c) 2015年 张艳锋. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageview; - (IBA

ABAP:关于隐式与显式的DB Commit

转自http://blog.163.com/[email protected]/blog/static/1394892972011611111559962/#userconsent#1.显式的DB Commit 显式的DB Commit并没有对应的ABAP 语句来执行DB Commit,它是由平常的语句Commit Work来进行的.一个DB LUW中,我们是以该DB被打开,然后以DB Commit结束. 2.隐式的DB Commit 隐式的DB Commit更没有对应的ABAP语句来告诉系统(

activity的隐式和显式启动

显式Intent(Explicit intent):通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent(Implicit intent):通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间. 显式: Intent intent=new Intent(MainActivity.this,SettingActivity.class); startActivity(