隐式游标介绍

Oracle数据库迁移到KingbaseES数据库,不需要将源PL/SQL脚本,大规模修改为KES语法,因为KingbaseES支持大部分PLSQL语法。

1、隐式游标

隐式游标是由 PL/SQL 构造和管理的会话游标。

每次运行 SELECT 或 DML 语句时,PL/SQL 都会打开一个隐式游标。您无法控制隐式游标,但可以从其属性中获取信息。

隐式游标属性值的语法是 SQL%attribute,SQL%attribute 总是指向最近运行的 SELECT 或 DML 语句。 如果没有运行这样的语句,则 SQL%attribute 的值为 NULL。隐式游标在其关联语句运行后关闭。但是,在另一个 SELECT 或 DML 语句运行之前,它的属性值仍然可用。最近运行的SELECT或DML语句可能在不同的范围内。要保存属性值以供以后使用,请立即将其分配给局部变量。 否则,其他操作(例如子程序调用)可能会在您测试之前更改属性的值。

2、隐式游标属性值的用途

隐式游标属性是:

- SQL%ISOPEN 属性:游标是否打开?
- SQL%FOUND 属性:是否有任何行受到影响?
- SQL%NOTFOUND 属性:没有行受到影响?
- SQL%ROWCOUNT 属性:有多少行受到影响?

3、简单例子

--SQL%attribute的值,可以获得最新一条DQL和DML语句的运行信息
do language plsql
$$
declare
i int;
begin delete from oo02 where rownum <= 0;
DBMS_OUTPUT.PUT('staSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('staSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); delete from oo02 where rownum <= 10;
DBMS_OUTPUT.PUT('staSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('staSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); end;
$$; ANONYMOUS BLOCK
staSQL : 0,false,false,true
staSQL : 0 staSQL : 10,false,true,false
staSQL : 10

  

二、KingbaseES 隐式游标属性值的不能获得动态SQL的执行信息

1、Oracle 场景

在Oracle数据库的PLSQL语句中,动态SQL语句的执行信息,也可以通过隐式游标属性获取。

begin
execute immediate 'delete from sch01.TT01 where rownum <= 10';
DBMS_OUTPUT.PUT('dynSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || (case when sql % ISOPEN then 'true' else 'false' end) || ',' ||
(case when sql % found then 'true' else 'false' end) || ',' ||
(case when sql % notfound then 'true' else 'false' end)); execute immediate 'delete from sch01.TT01 where rownum <= 0';
DBMS_OUTPUT.PUT('dynSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || (case when sql % ISOPEN then 'true' else 'false' end) || ',' ||
(case when sql % found then 'true' else 'false' end) || ',' ||
(case when sql % notfound then 'true' else 'false' end));
rollback;
end; dynSQL : 10,false,true,false
dynSQL : 0,false,false,true

  

2、KingbaseES 场景

在KingbaseES数据库的language PLSQL的语句中,动态SQL语句的执行信息,隐式游标属性不被赋值,仍然保留上一次的数值。

do language plsql
$$
declare
i int;
begin execute ' delete from oo02 where rownum <= :rn ' using 20;
DBMS_OUTPUT.PUT('dynSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('dynSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); delete from oo02 where rownum <= 0;
DBMS_OUTPUT.PUT('staSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('staSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); execute ' delete from oo02 where rownum <= :rn ' using 20;
DBMS_OUTPUT.PUT('dynSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('dynSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); delete from oo02 where rownum <= 10;
DBMS_OUTPUT.PUT('staSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('staSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); execute ' delete from oo02 where rownum <= :rn ' using 20;
DBMS_OUTPUT.PUT('dynSQL : ');
DBMS_OUTPUT.PUT_LINE(sql % rowcount || ',' || sql % ISOPEN || ',' || sql % found || ',' || sql % notfound);
GET DIAGNOSTICS i := row_count;
DBMS_OUTPUT.PUT_LINE('dynSQL : ' || i);
DBMS_OUTPUT.PUT_LINE(' '); rollback;
end;
$$;
ANONYMOUS BLOCK
dynSQL :
dynSQL : 20 staSQL : 0,false,false,true
staSQL : 0 dynSQL : 0,false,false,true
dynSQL : 20 staSQL : 10,false,true,false staSQL : 10 dynSQL : 10,false,true,false
dynSQL : 20

  

KingabseES 隐式游标属性值(SQL%attribute)的更多相关文章

  1. PL/SQL -->隐式游标(SQL%FOUND)

    PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...

  2. PL/SQL — 隐式游标

    一.隐式游标的定义及其属性 定义 隐式游标由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性.其过程由oracle控制,完全自动化.隐式游标的名称是SQL,不能对SQL游标显式地执行OPE ...

  3. Oracle pl/sql 显示游标和隐式游标

    显示游标 一.定义语法:        CURSOR <游标名> IS         <SELECT 语句>         [FOR UPDATE | FOR UPDATE ...

  4. oracle的隐式游标

    游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...

  5. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

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

  6. Oracle游标cursor1基础和隐式游标

    --指向表行的指针,一次一行,一般向前移动 Resultset --游标永远代代表的是一行数据. /* 使用步骤 第一步:声明游标,就像是声明一个变量样. 游标的关键字就是cursor. Declar ...

  7. ORACLE的显式游标与隐式游标

    1)查询返回单行记录时→隐式游标: 2)查询返回多行记录并逐行进行处理时→显式游标 显式游标例子: DECLARE CURSOR CUR_EMP IS SELECT * FROM EMP; ROW_E ...

  8. Oracle异常处理内容,隐式游标

    异常处理 create or replace procedure pr_test3(v_bh in varchar2,v_xx out t_hq_ryxx%rowtype) is begin sele ...

  9. Oracle 隐式游标 存储过程

    --隐式游标 注意变量赋值用(:=) 连接符用(||)而不是加号(+) DECLARE v_pk T_PLAT_KEYWORD.ID%TYPE; --主键 v_amount_message T_PLA ...

  10. ms sql 根据表名查询 表中所有字段的属性值 sql语句

    SELECT表名=case when a.colorder=1 then d.name else '' end,--表说明=case when a.colorder=1 then isnull(f.v ...

随机推荐

  1. 【framework】ConfigurationContainer简介

    1 前言 ​ 如图所示,ConfigurationContainer 是 AMS 家族的重要基类:WindowContainer 继承自 ConfigurationContainer,是 WMS 家族 ...

  2. Vue+SpringBoot+ElementUI实战学生管理系统-6.院系管理模块

    1.章节介绍 前一篇介绍了用户管理模块,这一篇编写院系管理模块,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.实现效果 院系列表 修改院系 4.模块 ...

  3. spring boot实现邮箱验证码注册

    最近在设计自己的博客系统,涉及到用户注册与登录验证. 注册这地方我先采用最传统的邮箱验证码方式.具体的实现方式如下: 1.有关如何配置spring boot发送邮件,请参考我的另一篇文章: https ...

  4. golang指针和结构体

    指针 指针操作 指针包括指针地址.指针类型和指针取值 &: &符号放在变量前面进行取地址操作 **:*放在变量前面根据地址进行取值 指针地址: func main() { var a ...

  5. centos上使用makefile编译sliver时 提示gcc 错误,cannot find -ldl cannot find -lpthread cannot find -lc

    github.com/bishopfox/sliver/server /usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit ...

  6. webrtc 的理解

    常规视频的传输包括以下几个步骤:采集,编码,推流,转码,分发,拉流,解码和渲染 在一个实时的音视频系统架构里,上面的每个环节都会有一定程度的优化空间. 以下内容摘自:rtmp直播和webrtc直播对比 ...

  7. leetcode 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  8. 【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答

    问题描述 PHP应用再连接Azure Redis服务时,出现Connection Timed out.当通过升级提高Azure Redis的性能时候,发现之前的数据丢失了. 问题解答 当Redis服务 ...

  9. 网络流与各种建模(I)

    网络流与各种建模(I) 网络流基础 这里默认读者学习过网络流和MCMF,这里仅作复习 网络流解决的问题是给一个源点和汇点,每个边有最大流量,最大化从源点放水到汇点的速率. 网络流的时间复杂度是 \(O ...

  10. 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \

    为什么 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \ 快速移动到下一个 注意有时候输入法会有问题 因为 Ctrl + Shift 是切换输入法,所以回头 ...