隐式游标介绍

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. 使用UTL_HTTP包获取网页内容

    UTL_HTTP 包提供了容易的方式通过HTTP协议获取网页内容,下面结合几个例子介绍一下: ----------------------------------------------------- ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题

    一.对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数,第二种方法是运行RECURSIVE-MATRIX-CHAIN.证明你的结 ...

  3. 红胖子(红模仿)的博文大全:开发技术集合大版本更新v4.0.0

    <红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中...>大版本更新,更新后版本 ...

  4. chrony同步时间

    chrony文件组成 包:chrony 两个主要程序:chronyd和chronyc - chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务同步.它确定计算机增减时间的比率,并 ...

  5. flask操作mongodb

    一个简单的注册登录 from pymongo import MongoClient MC = MongoClient('127.0.0.1', 27017) MongoDB = MC['s2'] #创 ...

  6. Redis加Lua脚本实现分布式锁

    先讲一下为什么使用分布式锁: 在传统的单体应用中,我们可以使用Java并发处理相关的API(如ReentrantLock或synchronized)来实现对共享资源的互斥控制,确保在高并发情况下同一时 ...

  7. 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis删除 TLS 1.0 和 1.1的计划及问题

    问题描述 Azure Redis 正式关闭TLS1.0和1.1关闭的时间 根据文档描述Azure Redis阶段2我们将停止支持 TLS 1.1 和 TLS 1.0,暂时计划 2020 年 12 月 ...

  8. 【Azure Fabric Service】怎样关闭 Azure Service Fabric?

    问题描述 怎样关闭Azure Service Fabric服务呢?在Azure门户上没有找到 Stop 按钮. 问题回答 Azure Service Fabric 默认是无法停止的,可以删除. 虽然可 ...

  9. 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?

    问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...

  10. 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践

    作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...