一、游标的概念
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是将从数据库中提取的数据块,临时存储到计算机内存中进行处理,从而提高数据处理速度,最后将处理结果显示出来或最终写回数据库,提高数据处理的效率。
游标的类型有两种,一种是静态游标一种是动态游标;而静态游标又分为两种,一种是显示游标,由用户定义、操作,用于处理返回多行数据的select查询;一种是隐式游标,由系统自动进行操作,用于处理DML增删查改insert、delete、select、update返回和单行查询select...into...语句。
二、静态游标
上面提到过,静态游标分为显示游标和隐式游标,下面就分开介绍这两种游标:
静态游标之显示游标
显示游标必须在PL/SQL块的声明部分定义,也可以引用变量,但引用的变量必须在游标定义之前定义,其基本语法定义如下:
CURSOR cursor_name IS select_statement
在使用游标时,我们需要打开,其基本语法如下:
OPEN cursor_name
如果需要检索游标,将游标的数据对应到定义的变量,其基本语法如下:
FETCH cursor_name INTO variable_list|record_variable
使用完毕后,为了数据库资源更好的利用,则是需要关闭游标,其基本语法如下:
CLOSE cursor_name
关于PL/SQL结构部分,之前有写相关介绍博文,具体可访问下面链接了解:
达梦数据库PL/SQL之控制结构_明月装饰你的窗的博客-CSDN博客
下面我们看一个简单的游标应用示例
首先创建要给测试表TEST1,插入几条测试数据,具体数据如下:
目前TEST1表里数据,custins_id=4的AAA字段是A,然后我们通过游标,将这个AAA数据update更新为‘d’测试:首先定义一个游标testa为select查询TEST1表数据,后续打开游标,用IF判断testa游标查询结果是否为真,如果查询到数据,则更新custins_id=4这个条件下AAA列字段为d;若testa游标查询结果为假,则打印语句‘There is not custins_id equal to 4!’,关闭游标后程序结束。
从上面执行结果可以看到,当前我们执行成功,sql执行影响一条记录,然后我们查询是否更新数据成功:
由上面测试也可以调整,由于我们TEST1表数据只有4条,如果我们把游标select查询where条件指定为custins=5测试:
在上面我们一直在用$cursor_name%FOUND作为判断条件,这里就引申出了游标的另一个概念,即游标属性,目前达梦PL/SQL支持的游标属性有下面几种:
cursor_name%ISOPEN:布尔型,游标是否打开。是则返回 TRUE,否则返回 FALSE。
cursor_name%FOUND: 布尔型,语句是否修改或查询到了记录,是则返回 TRUE,否则返回 FALSE;
cursor_name%NOTFOUND:布尔型,语句是否未能成功修改或查询到记录,是则返回 TRUE,否则返回FALSE;
cursor_name%ROWCOUNT:数值型,DML 语句执行影响的行数,或 SELECT…INTO 语句返回的行数。
下面再写一个示例,同样测试表为DMHR.CITY表,将我们上面提到的几种游标属性全部应用进去(%FOUND和%NOTFOUND基本类似):
从上面的示例中可以看到,我们主要用的是IF判断,执行后续相关操作,实际应用中,我们也可以使用到LOOP循环,for循环,while循环等,下面是针对DM数据库DMHR.CITY表的一个简单循环示例:
静态游标之隐式游标
隐式游标没有OPEN、FETCH、CLOSE命令,用于处理INSERT、UPDATE、DELETE和SELECT…INTO语句,其属性和显示游标一样有四种:
SQL%ISOPEN:布尔型,游标是否打开。是返回 TRUE,否返回 FALSE。
SQL%FOUND: 布尔型,语句是否修改或查询到了记录,是返回 TRUE,否则返回 FALSE。
SQL%NOTFOUND:布尔型,语句是否未能成功修改或查询到记录,是返回 TRUE,否则返回FALSE;
SQL%ROWCOUNT:数值型,DML 语句执行影响的行数,或 SELECT…INTO 语句返回的行数。
稍微修改一下SQL,让其可以修改数据:
三、动态游标
静态游标在使用时,使用的查询语句已经确定;如果需要在运行的时候动态的绝对执行哪种查询,可以使用REF游标(动态游标)和游标变量。
创建游标变量的基本语法如下:
TYPE ref_cursor_name IS REF CURSOR;
cursor_name ref_cursor_name;
下面还是用DMHR.CITY表的数据作为测试表,打印出城市ID和城市名:
在上面的示例中,我们额外定义了变量V_ID和V_NAME,用来作为输出时使用,为了简化变量,以及防止变量数据类型定义错误,我们在定义变量的时候,也可以使用%TYPE和%ROWTYPE来引用源表数据类型,修改SQL后如下图所示:
以上就是总结的达梦PL/SQL中关于游标的介绍,更多相关内容,可访问达梦官网学习
https://eco.dameng.com/docs/zh-cn/start/index.html