plsql存过声明游标_plsql--游标用法

1.游标概念

在 PL/SQL 块中执行 SELECT、INSERT、DELETE 和 UPDATE 语句时,ORACLE 会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或

是命名一个工作区(Work Area),或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式

SQL 语句的应用程序的常用编程方式。

在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件中的

OPEN_CURSORS 参数定义。

对于不同的 SQL 语句,游标的使用情况不同:

非查询语句--》 隐式的

结果是单行的查询语句 --》隐式的或显示的

结果是多行的查询语句--》 显示的

2.处理显示游标

2.1显示游标处理的4个步骤

1.定义/ / 声明 游标:就是定义一个游标名,以及与其相对应的 SELECT 语句。

格式:

CURSOR cursor_name[(parameter[, parameter]…)]

[RETURN datatype]

IS

select_statement;

注意:1.游标参数只能为输入参数

2.在指定数据类型时,不能使用长度约束

3.[RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与 select_statement 中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。

2.打开游标

就是执行游标所对应的 SELECT 语句,将其查询结果放入工作区,并且指

针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有 FOR UPDATE 选

项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。

格式:OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];

3.提取游标

就是检索结果集合中的数据行,放入指定的输出变量中。

格式:FETCH cursor_name INTO {variable_list | record_variable };

执行 FETCH 语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当

检索到最后一行数据时,如果再次执行 FETCH 语句,将操作失败,并将游标属性

%NOTFOUND 置为 TRUE。所以每次执行完 FETCH 语句后,检查游标属性%NOTFOUND

就可以判断 FETCH 语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了

值。

4.关闭游标

当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占

用的系统资源,并使该游标的工作区变成无效,不能再使用 FETCH 语句取其中数据。

关闭后的游标可以使用 OPEN 语句重新打开。

格式:CLOSE cursor_name;

注意:定义的游标不能有 INTO 子句。

游标属性

游标属性 属性作用

Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作 FETCH成功则为 TRUE,否则为 FALSE;

Cursor_name%NOTFOUND 布尔型属性,与%FOUND 相反;

Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;

Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。

2.2使用案例

--普通游标

declare

cursor emp_cursor1 is

select ename,sal from emp where sal < 1000;

v_name emp.ename%type;

v_sal emp.sal%type;

begin

open emp_cursor1;

loop

fetch emp_cursor1

into v_name,v_sal;

exit when emp_cursor1%notfound;

dbms_output.put_line(v_name || '---' || v_sal);

--dbms_output.put_line('isOpen:'||emp_cursor1%isopen); --查看游标状态

end loop;

close emp_cursor1;

end;

--游标传参

declare

cursor emp_cursor2(cursor_sal number default 2000) is --(此处的参数是默认参数,后面可以重新设置,此默认值失效)

select ename,sal from emp where sal >= cursor_sal;

v_name emp.ename%type;

v_sal emp.sal%type;

begin

open emp_cursor2(cursor_sal=>3000); --(重新设置参数值)

loop

fetch emp_cursor2

into v_name,v_sal;

exit when emp_cursor2%notfound;

dbms_output.put_line(v_name || '---' || v_sal);

end loop;

dbms_output.put_line('rowcount:'||emp_cursor2%rowcount); --(游标记录数)

close emp_cursor2;

end;

--if...then(给工资低于2000的员工加薪1元)

declare

cursor emp_cursor3 is

select ename, sal, empno from emp;

v_no emp.empno%type;

v_name emp.ename%type;

v_sal emp.sal%type;

begin

open emp_cursor3;

loop

fetch emp_cursor3

into v_name, v_sal, v_no;

exit when emp_cursor3%notfound;

if v_sal <= 2000 then

update emp set sal = sal + 1 where empno = v_no;

dbms_output.put_line(v_name || '---' || v_sal);

end if;

end loop;

dbms_output.put_line('rowcount:' || emp_cursor3%rowcount);

close emp_cursor3;

end;

--有参数有返回值的游标(记录类型)

declare

type emp_record_type is record(

v_no emp.empno%type,

v_name emp.ename%type,

v_sal emp.sal%type);

v_emp_record emp_record_type;

cursor emp_cursor4(dept_no number) return emp_record_type is

select empno, ename, sal from emp where deptno = dept_no;

begin

open emp_cursor4(dept_no=>20);

loop

fetch emp_cursor4

into v_emp_record;

if emp_cursor4%found then

dbms_output.put_line(v_emp_record.v_name || '---' ||

v_emp_record.v_sal);

else

dbms_output.put_line('已经处理完结果集');

exit;

end if;

end loop;

close emp_cursor4;

end;

--for循环格式游标

declare

cursor emp_cursor5 is

select ename, sal from emp;

begin

for v_sal in emp_cursor5 loop

dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);

end loop;

end;

--for循环格式游标带参数

declare

cursor emp_cursor5(dept_no number) is

select ename, sal from emp where deptno=dept_no;

begin

for v_sal in emp_cursor5(30) loop

dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);

end loop;

end;

--for循环子查询方式游标

begin

for v_sal in (select ename, sal from emp where deptno=20) loop

dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);

end loop;

end;

3.处理隐式游标

显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对

于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建

其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为 SQL,这是由

ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE

系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操

作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的

一条 SQL 语句所包含的数据。

格式调用为: SQL%

隐式游标属性

属性 值 SELECT INSERT UPDATE DELETE

SQL%ISOPEN FALSE FALSE FALSE FALSE

SQL%FOUND TRUE 有结果 成功 成功

SQL%FOUND FALSE 没结果 失败 失败

SQL%NOTFUOND TRUE 没结果 失败 失败

SQL%NOTFOUND FALSE 有结果 成功 失败

SQL%ROWCOUNT 返回行数,只为 1插入的行数 修改的行数 删除的行数

使用案例:

DECLARE

v_rows NUMBER;

BEGIN

--更新数据

UPDATE emp SET sal = 30000

WHERE deptno = 20;

--获取默认游标的属性值

v_rows := SQL%ROWCOUNT;

DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'个雇员的工资');

--回退更新,以便使数据库的数据保持原样

ROLLBACK;

END;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

objectid.go源码阅读

/*http://docs.mongodb.org/manual/reference/object-id/ObjectId 按照字节顺序&#xff0c;一次代表&#xff1a;ObjectId is a 12-byte BSON type, constructed using:4个字节代表1970年元月一日到现在毫秒数 UNIX时间戳a 4-byte value representing the seconds since the …

实例

文章目录函数积分图散点条形图球员能力值函数积分图 import matplotlib.pyplot as plt import numpy as np from matplotlib.pyplot import Polygon def func(x):return -(x-2)*(x-8)40 xnp.linspace(0,10) yfunc(x) axplt.subplot() plt.plot(x,y,r,linewidth2)a2 b9 ax.set_…

闲来无事,拆个示波器玩玩。

首先要解释一下何为混合域示波器&#xff0c;既然说到这个话题就不得不说一下示波器进化史了&#xff0c;接下来大概讲一下示波器进化简史。第一代示波器——模拟示波器(ART-analog real time oscilloscope )纯模拟机器&#xff0c;使用示波管显示X-Y扫描成像显示波形&#xff…

r roc函数_R绘制ROC曲线 | Public Library of Bioinformatics

ROC曲线&#xff0c;受试者工作特征曲线 (receiver operating characteristic curve&#xff0c;简称ROC曲线)&#xff0c;又称为感受性曲线(sensitivity curve)。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈)&#xff0c;以真阳性率(灵敏度)为纵坐标&#xff0c;假阳…

机器算法1)

SKLEARN Scikit-learn与特征工程 “数据决定了机器学习的上限&#xff0c;而算法只是尽可能逼近这个上限”&#xff0c;这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据&#xff0c;那么需要…

老罗直播——只要给你一个机会,你就伸双手去接!

昨天&#xff0c;4月1日&#xff0c;罗永浩在抖音上直播卖货。一时间舆论纷纷&#xff0c;有吐槽老罗状况频出的&#xff0c;也有感叹老罗为了挣钱能屈能伸的。总之&#xff0c;有人讨论&#xff0c;有人关注&#xff0c;这个事件已经成功了一大半。老罗与抖音签约费是6000万&a…

segmenter.go

//Go中文分词package segoimport ("bufio""fmt""log""math""os""strconv""strings""unicode""unicode/utf8")const (minTokenFrequency 2 // 仅从字典文件中读取大于等于此频率的…

我在MTK平台下调试音频ALSA

#前言前言我就随便写了&#xff0c;因为是项目的需要&#xff0c;我需要在我们的MTK8167S平台上面调试音频。包括录音和播放。#硬件原理图因为是我们公司的项目&#xff0c;我就不能把完整的原理图给出来。因为两个MIC不涉及机密&#xff0c;跟MTK的公版是一样的。可以给出来大…

java 左边补0_java 数字左补齐0

NumberFormat nf NumberFormat.getInstance();//设置是否使用分组nf.setGroupingUsed(false);//设置最大整数位数nf.setMaximumIntegerDigits(2);nf.setMinimumIntegerDigits(2);//可以左补齐两位数的数字//以下是查询当前天数的所有日期String nowDaygetNowYMD();String curD…

一切不怕从零开始

不知道大家有没有看过吴京题为<<一切不怕从零开始>>的演讲。我曾经刷微博的时候看到过,印象和触动最深的是他的那句"我走过很多的路,换过很多的方向,不敢说有什么成就,到今天我觉得唯一能够让我拿出来炫耀的可能就是,我不害怕从头开始"。这样的话,对年龄…

60、二叉搜索树的第k个结点

一、题目 给定一颗二叉搜索树&#xff0c;请找出其中的第k大的结点。例如&#xff0c; 5 / \ 3 7 /\ /\ 2 4 6 8 中&#xff0c;按结点数值大小顺序第三个结点的值为4。 二、解法 1 package algorithm7;2 3 public class KthNode62 {4 public static void main(String[] ar…

机器学习算法3

文章目录转换器与估计器分类算法-K近邻算法一个例子弄懂k-近邻计算距离公式sklearn.neighborsMethodk近邻实例k-近邻算法案例分析对Iris数据集进行分割对特征数据进行标准化朴素贝叶斯概率论基础联合概率与条件概率联合概率条件概率如果每个事件相互独立拉普拉斯平滑sklearn朴素…

嵌入式杂谈之文件系统

文件系统可以说是嵌入式中的一大块&#xff0c;也是绕不过的一部分。之前我对文件系统认知一直停留在在U盘格式的理解上&#xff0c;直到接触了嵌入式Linux才发现这里面大有文章&#xff0c;以Linux启动挂载根文件系统为例&#xff0c;这个文件系统可以是真正的存储设备上的文件…

qtscrcpy自定义按键_按键映射说明.md

# 自定义按键映射说明按键映射文件为json格式&#xff0c;新增自己的按键映射文件需要放在keymap目录中才可以被QtScrcpy识别。按键映射文件的具体编写格式下面会介绍&#xff0c;也可以参考自带的按键映射文件。## 按键映射脚本格式说明### 通用说明- 按键映射中的坐标位置都是…

docker发布spring cloud应用

原文地址&#xff1a;http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目&#xff1a; cloud-simple-docker&#xff1a;一个简单的spring boot应用 Docker是一种虚拟机技术&#xff0c;准确的说是在linux虚拟机技术LXC基础上又封装了一层&#xff0c;可以看成是…

Linux块设备IO子系统

块设备是Linux三大设备之一&#xff0c;其驱动模型主要针对磁盘&#xff0c;Flash等存储类设备&#xff0c;块设备&#xff08;blockdevice&#xff09;是一种具有一定结构的随机存取设备&#xff0c;对这种设备的读写是按块(所以叫块设备)进行的&#xff0c;他使用缓冲区来存放…

机器学习算法4

文章目录精确率和召回率分类器性能评估混淆矩阵分类模型sklearn.metrics.classification_report决策树认识决策树优缺点信息的度量和作用信息熵决策树划分依据之信息增益api实战method决策树优缺点分析实例随机森林集成方法&#xff08;分类&#xff09;之随机森林学习算法skle…

unity怎么制作云飘动_Unity 如何制作星空粒子效果?

本经验介绍在Unity游戏引擎中使用Particle System&#xff0c;如何使用自带资源&#xff0c;快速制作星空的粒子特效。工具/原料Unity方法/步骤1:首先&#xff0c;新建一个场景&#xff0c;如果有自己的天空盒资源的话&#xff0c;在Window->Lighting下设置下天空(默认天空盒…

[芦半山]Android native分析工具ASAN和HWASAN原理解析

ASAN和HWASAN原理解析由于虚拟机的存在&#xff0c;Android应用开发者们通常不用考虑内存访问相关的错误。而一旦我们深入到Native世界中&#xff0c;原本面容和善的内存便开始凶恶起来。这时&#xff0c;由于程序员写法不规范、逻辑疏漏而导致的内存错误会统统跳到我们面前&am…

线性回归,岭回归

文章目录线性回归回归算法回归算法之线性回归优缺点损失函数梯度下降算法LinearRegression属性加入交叉验证线性回归案例分析波士顿房价预测5.性能评测案例欠拟合与过拟合解决过拟合的方法回归算法之岭回归sklearn.linear_model.Ridge方法属性案例分析线性回归 回归算法 回归…