首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PLSQL-游标

PLSQL-游标

作者头像
字母哥博客
发布于 2020-09-23 03:17:51
发布于 2020-09-23 03:17:51
91800
代码可运行
举报
运行总次数:0
代码可运行

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

  • 游标可分为: 1.静态游标:分为显式(explicit)游标和隐式(implicit)游标。 2.REF游标(动态游标):是一种引用类型,类似于指针。
  • 显式和隐式游标的区别: 尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。
  • REF游标和静态游标的区别 1)静态游标不能返回到客户端。ref游标能够被返回到客户端,是从Oracle的存储过程返回结果集的方式。 2)不能在包说明或包体中的过程或函数之外定义ref游标。只能在定义ref游标的过程中处理它,或返回到客户端应用程序。 3)ref游标可以从子例程传递到子例程,而游标则不能。 为了共享静态游标,必须在包说明或包体中把它定义为全局游标。 4)使用静态游标--通过静态SQL(但不用ref游标)--比使用ref游标效率高,

静态游标

显式游标

  • 显式游标的使用方法: 第一步:声明游标 第二步:打开游标 第三步:使用游标进行循环操作 第四步:关闭游标
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create or replace procedure TEST is
  cursor c1(inname in varchar2) is
    select tname from tab where tname like inname;
  pname varchar2(32);
begin
  open c1('T%');
  loop
    fetch c1 into pname;
    exit when c1%notfound;
    dbms_output.put_line(pname);
  end loop;
  close c1;
end TEST;

DML隐式游标

  • 在PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
begin
  update departments set department_name = department_name;
  dbms_output.put_line('update ' || sql%rowcount || ' records');
end;

CURSOR FOR IN LOOP隐式游标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//例子1:无参数,使用循环,无须打开关闭游标
create or replace procedure TEST is
  cursor c1 is select tname from tab;
begin
  for rr in c1 loop
    dbms_output.put_line(rr.tname);
  end loop;
end TEST;
//例子2:有参数,使用循环,无须打开关闭游标
create or replace procedure TEST is
    cursor c1(inname in varchar2) is select tname from tab where tname like inname;
begin
  for rr in c1('T%') loop
    dbms_output.put_line(rr.tname);
  end loop;
end TEST;

游标的常用属性

  • %FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。
  • %NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
  • %ROWCOUNT:当前时刻已经从游标中获取的记录数量。
  • %ISOPEN:是否打开。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare  /* /* 定义静态游标 */ */
  Cursor emps is
    Select * from employees where rownum < 6 order by 1;
  emp employees%rowtype;
  row number := 1;
begin
  Open emps; /* ´打开静态游标 */
  fetch emps into emp; /*  读取游标当前行  */
  loop
    if emps%found then
      dbms_output.put_line('Looping over record ' || row || ' of ' || emps%rowcount);
      fetch emps into emp;
      row := row + 1;
    elsif emps%notfound then
      exit;
    end if;
  End loop;

  If emps%isopen then
    close emps; /*  关闭游标  */
  End if;
End;

游标的更新与删除

  • UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串.
  • 当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。
  • 在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。
  • 在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下: WHERE{CURRENT OF cursor_name|search_condition}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create or replace procedure pc_SetVersionValid(PFlowsID in integer) is
  Cursor c1 is
    select * from wf_flows
    where flowname in
           (select flowname from wf_flows where flowsid = PFlowsID)
    for update;

  r c1%rowtype;
  v integer;
begin
  open c1;
  fetch c1 into r;
  while c1%found loop
    if r.flowsid = PFlowsID then
      v := 1;
    else
      v := 0;
    end if;
    UPDATE wf_flows SET isValid = v WHERE CURRENT OF c1;
    fetch c1 into r;
  end loop;
  close c1;
  commit;
end;

引用游标ref cursor

弱类型引用游标,就是不指定游标将要提取的数据行的类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
       type my_cur_type is ref cursor;
       mycur my_cur_type;--声明引用游标变量

       which varchar2(10);
       deptrow dept%rowtype;
       emprow emp%rowtype;
begin

     which := '&请选择dept还是emp';
     if (which = 'dept') then
        open mycur for select * from dept;      --引用游标可以动态sql
        loop
            fetch mycur into deptrow;
            exit when (mycur%notfound);
            dbms_output.put_line(deptrow.deptno || '  ' || deptrow.dname);
        end loop;
     elsif (which = 'emp') then
        open mycur for select * from emp;       --引用游标可以动态sql
        loop
            fetch mycur into emprow;
            exit when (mycur%notfound);
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;

     end if;

     close mycur;
end;

强类型引用游标

  • 就是指定游标将要提取的数据行的类型 ,只能是record或%rowtype类型.比如:return number是错的,return emp.ename%type也是错的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
       type mycurtype is ref cursor return emp%rowtype;
       mycur mycurtype;--声明变量

       emprow emp%rowtype;
begin
        open mycur for select * from emp;
        loop
            fetch mycur into emprow;
            exit when mycur%notfound;
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;

        close mycur;
end;

喜欢 (9)or分享 (0)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-09),如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MATLAB 从零到进阶】day5 数据的导入与导出
importdata 从文本文件或特殊格式二进制文件(如图片,avi 视频等)读取数据
Ai学习的老章
2019/04/10
1.6K0
【MATLAB 从零到进阶】day5  数据的导入与导出
matlab导出csv文件多种方法实现
R,C分别表示写入的行数R和列数C,并且左上角被认为是(0,0)csvwrite('1.csv',data)
演化计算与人工智能
2020/08/14
8.5K0
matlab导出csv文件多种方法实现
在线matlab代码学习神器Octave Online
Octave与MATLAB完全兼容,免安装使用方便。注册和非注册功能会有不同,如下:
zhangrelay
2019/01/23
7K0
一起来学matlab-matlab学习笔记5 低级文件输入输出函数
本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一些负面消息对国内各个高校和业界影响很大。但是我们作为技术人员,更是要奋发努力,拼搏上进,学好技术,才能师夷长技以制夷,为中华之崛起而读书!
演化计算与人工智能
2020/08/14
1.7K0
MATLAB中的高维数据操作与异构数据结构管理
在MATLAB中,数据处理是科学计算和工程模拟的核心组成部分。MATLAB提供了强大的数组和数据结构处理能力,尤其适用于高维数据的存储、操作与分析。本篇文章将深入探讨MATLAB中的多维数组和复杂数据结构的处理方法,并通过代码实例展示如何高效地进行相关操作。
一键难忘
2025/02/08
1.3K0
MATLAB-常见命令使用
使用MATLAB的时候有一些系统命令可以方便我们的操作,如在当前的工作区中可以使用系统命令保存为一个文件、加载文件、显示日期、列出目录中的文件和显示当前目录等。
用户9925864
2022/07/27
1.9K0
MATLAB读取图片并转换为二进制数据格式
本文记录使用 MATLAB 读取图片并转换为二进制数据格式的方法,避免后面再做无用功。
Gnep@97
2024/01/10
1.5K0
MATLAB读取图片并转换为二进制数据格式
Matlab系列之文件操作
首先介绍下文件操作的相关概念吧,文件一般指存储在外部介质上的数据的集合,即一般数据是以文件的形式存储在外部介质上,这个介质可以是我们的硬盘也可以是其他的具有存储能力的物体。
狂人V
2020/07/20
2.6K0
matlab读取txt文件数据_matlab怎么输入数据
大家好,又见面了,我是你们的朋友全栈君。 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:  ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。  ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。  ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。  ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。  ‘a’:在打开的文件末端添加数据。文件不存在则创建。  ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen(‘d:\test.bin’,’wb’) %以二进制数据写入方式打开文件 fid = 3 %其值大于0,表示打开成功 >> fwrite(fid,a,’double’) ans = 9 %表示写入了9个数据 >> fclose(fid) ans = 0 %表示关闭成功 2)读二进制文件 fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为: [A,COUNT]=fread(fid,size,precision) 说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。 3、文本文件的读写操作 1)读文本文件 fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为: [A,COUNT]=fscanf(fid,format,size) 说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。 2)写文本文件 fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为: fprintf(fid,format,A) 说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。 例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。 >> a=’string’; >> fid=fopen(‘d:\char1.txt’,’w’); >> fprintf(fid,’%s’,a); >> fclose(fid); >> fid1=fopen(‘d:\char1.txt’,’rt’); >> fid1=fopen(‘d:\c
全栈程序员站长
2022/10/04
1.9K0
MATLAB仿真总结
工作区存在的变量可能会对脚本运行产生影响,故代码(脚本)开头需要添加如下命令
sea-wind
2019/09/11
1K0
matlab—特殊变量类型与档案存取
这里举个例子,有一个学生structure,包含姓名、邮箱、学号、成绩,应该如何创建这个structure
mathor
2018/07/24
1.1K0
matlab—特殊变量类型与档案存取
Matlab中读取txt文件的几种方法[通俗易懂]
2、importdata——只读取数据,自动省略数据格式前后的字符,超大文件不适合;
全栈程序员站长
2022/10/03
21.6K0
matlab
对于一些nc数据或者遥感影像处理时,虽然一些第三方软件可以出图,但我们往往需要借助python或者matlab软件进行数据处理,但最后保存下来数据如何导入arcgis进行分析呢?
用户6841540
2024/08/05
8410
Matlab数据导入--importdata和load函数
在使用matlab将数据导入到工作空间的时候,经常会使用到两个函数,一个是importdata函数,另一个是load函数,它们的使用方法和使用场景是太相同的,如果不太注意就可能会犯错误,在这里做简要的说明和记录。
用户9925864
2022/07/27
1.2K0
Matlab数据导入--importdata和load函数
matlab 函数,matlab 语法1
如:输入:f = fullfile(‘C:’,’Applications’,’matlab’,’fun.m’) 得到:f =C:\Applications\matlab\fun.m
zhangjiqun
2024/12/17
5390
matlab 函数,matlab 语法1
matlab输出语句fprintf例子_matlab中compose函数
golang需要的基础是:首先初学Go语言要弄懂基础语法和概念;然后掌握文件操作、网络编程、锁、协程、对象序列化和反序列化,以及各种数据格式的封装等;最后接触数据库等,就可以模块化开发。
全栈程序员站长
2022/09/28
2.1K0
matlab输出语句fprintf例子_matlab中compose函数
Matlab文本操作
fid=fopen(’filename’,’permission’)或者fid=fopen(’filename’)
根究FPGA
2020/06/29
9300
matlab怎么fprintf,matlab中的fprintf函数怎么用「建议收藏」
matlab中的fprintf函数怎么用?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。
全栈程序员站长
2022/09/27
2.6K0
关于MATLAB读取txt文件的方法[通俗易懂]
一、如何读取一个文档下,多个txt文件? 一般读取的文件,命名都具有一定的规律,除去相同部分,剩下的变化按照时间、序号、某一特定的标志符等进行排列。 下面我们举个例子来操作。
全栈程序员站长
2022/10/04
2.2K0
Matlab 读写文件
一、读取文本文件 思路: 1、用fopen来打开一个文件句柄 2、用fgetl来获得文件中的一行,如果文件已经结束,fgetl会返回-1 3、用fclose来关闭文件句柄
week
2018/08/24
6060
推荐阅读
相关推荐
【MATLAB 从零到进阶】day5 数据的导入与导出
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验