首页 文章 精选 留言 我的

精选列表

搜索[参考文献管理],共10000篇文章
优秀的个人博客,低调大师

GaussDB数据库SQL系列-游标管理

目录 一、前言 二、概述(GaussDB) 1、游标概述 2、游标的使用分类 三、GaussDB中的显式游标(示例) 1、显式游标的使用与操作步骤 2、显式游标示例 四、GaussDB中的隐式游标(示例) 1、隐式游标简介 2、隐式游标示例 五、小结 一、前言 在数据库中,游标(cursor)是一种非常重要的工具,用于在数据库查询结果集中进行定位和操作。游标提供了一种在多行数据结果集中逐行处理每一行的机制,允许开发人员对每一行的数据进行操作,如检索、过滤、修改等。本文将结合GaussDB数据库,简单的给大家做一介绍。 二、概述(GaussDB) 1、游标概述 在GaussDB数据库中,为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 2、游标的使用分类 游标的使用分为显式游标和隐式游标。对于不同的SQL语句,游标的使用情况不同。 序号 SQL语句 游标 1 结果是多行的查询语句 显式的 2 非查询语句 隐式的 3 结果是单行的查询语句 隐式 / 显式 显式游标:显式游标主要用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。 隐式游标:对于非查询语句,如修改、删除操作,则由系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名称为SQL,这是由系统定义的。 游标循环:游标在WHILE语句、LOOP语句中的使用称为游标循环,一般这种循环都需要使用OPEN、FETCH和CLOSE语句。 三、GaussDB中的显式游标(示例) 1、显式游标的使用与操作步骤 第一步,定义(声明)游标:定义一个游标名,以及与其相对应的SELECT语句。 第二步,打开游标:执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN语句还将锁定数据库表中游标结果集合对应的数据行。 第三步,提取游标数据:检索结果集合中的数据行,放入指定的输出变量中。 第四步,对该记录进行处理。 第五步,继续处理,直到活动集合中没有记录。 第六步,关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH语句获取其中数据。关闭后的游标可以使用OPEN语句重新打开。 2、显式游标示例 --给工资大于等于20000的员工降薪500。 --复制一张测试表 CREATE TABLE company2 AS TABLE company1; CREATE OR REPLACE PROCEDURE cursor_p() AS DECLARE v_id NUMBER(6); v_salary NUMBER(8,2); CURSOR c1 IS SELECT id, salary FROM company2; BEGIN OPEN c1; LOOP FETCH c1 INTO v_id, v_salary; EXIT WHEN c1%NOTFOUND; IF v_salary>=20000 THEN UPDATE company2 SET salary =salary - 500 WHERE id = v_id; END IF; END LOOP; CLOSE c1; END; / --执行存储过程 CALL cursor_p(); --查看,比对结果变化 SELECT t2.*,t1.salary as "降薪前" FROM company2 t2 LEFT JOIN company1 t1 ON t2.id=t1.id ORDER BY ID ASC; 游标属性说明: %NOTFOUND是游标的属性之一,用于控制程序流程或者了解程序的状态。此处的意思是,当最近的DML(数据操作语言)操作(如INSERT,UPDATE,DELETE等)没有影响任何行时,该属性为真。也就是说,如果对表执行的操作没有找到任何匹配的行,那么这个属性就会为真,'EXIT WHEN c1%NOTFOUND;' 就会执行。 执行结果: 四、GaussDB中的隐式游标(示例) 1、隐式游标简介 对于隐式游标的操作,如定义、打开、取值及关闭操作,都由系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是最新处理的一条SQL语句所包含的数据,与用户自定义的显式游标无关。 2、隐式游标示例 --创建临时表,删除已离职的员工Allen,如果Allen已经不存在,则新增一条新员工信息(重名) CREATE TABLE company3 AS TABLE company1; CREATE OR REPLACE PROCEDURE cursor_p1() AS DECLARE v_name VARCHAR(10) := 'Allen'; BEGIN DELETE FROM company3 WHERE name = v_name; --根据游标状态做进一步处理 IF SQL%NOTFOUND THEN INSERT INTO company3 VALUES(4,v_name,24,'China',30000); END IF; END; / --执行 CALL cursor_p1(); --查看,比对执行结果 SELECT *, 'company1' as "company1" FROM company1 WHERE NAME ='Allen' union all SELECT *, 'company3' as "company3" FROM company3 WHERE NAME ='Allen' 游标属性说明: SQL%NOTFOUND 是GaussDB数据库中的一个属性,用于检查最近的 SQL 语句是否对数据库没有任何影响。如果 SQL 语句没有找到任何匹配的记录,那么这个属性就为真。所以,本段SQL中的IF SQL%NOTFOUND THEN 这一行代码的意思是:如果最近的 SQL 语句没有找到任何匹配的记录,那么就执行后续的代码。通常,这个语句用于处理 SQL 查询可能找不到数据的情况。 执行结果: 五、小结 在GaussDB数据库中,游标主要用于执行复杂的查询语句、处理多行数据以及进行数据操作等场景。游标的使用可以提高程序的灵活性和可维护性,并且可以减少不必要的内存消耗。使用游标,开发人员可以灵活地控制查询结果集的遍历顺序和处理方式,以满足不同的业务需求。 ——结束

优秀的个人博客,低调大师

HarmonyOS 管理页面跳转及浏览记录导航

历史记录导航 使用者在前端页面点击网页中的链接时,Web组件默认会自动打开并加载目标网址。当前端页面替换为新的加载链接时,会自动记录已经访问的网页地址。可以通过forward()和backward()接口向前/向后浏览上一个/下一个历史记录。 在下面的示例中,点击应用的按钮来触发前端页面的后退操作。 // xxx.ets import web_webview from '@ohos.web.webview'; @Entry @Component struct WebComponent { webviewController: web_webview.WebviewController = new web_webview.WebviewController(); build() { Column() { Button('loadData') .onClick(() => { if (this.webviewController.accessBackward()) { this.webviewController.backward(); return true; } }) Web({ src: 'https://www.example.com/cn/', controller: this.webviewController}) } } } 如果存在历史记录,accessBackward()接口会返回true。同样,您可以使用accessForward()接口检查是否存在前进的历史记录。如果您不执行检查,那么当用户浏览到历史记录的末尾时,调用forward()和backward()接口时将不执行任何操作。 页面跳转 当点击网页中的链接需要跳转到应用内其他页面时,可以通过使用Web组件的onUrlLoadIntercept()接口来实现。 在下面的示例中,应用首页Index.ets加载前端页面route.html,在前端route.html页面点击超链接,可跳转到应用的ProfilePage.ets页面。 ​ ● 应用首页index.ets页面代码。 // index.ets import web_webview from '@ohos.web.webview'; import router from '@ohos.router'; @Entry @Component struct WebComponent { webviewController: web_webview.WebviewController = new web_webview.WebviewController(); build() { Column() { Web({ src: $rawfile('route.html'), controller: this.webviewController }) .onUrlLoadIntercept((event) => { let url: string = event.data as string; if (url.indexOf('native://') === 0) { // 跳转其他界面 router.pushUrl({ url:url.substring(9) }) return true; } return false; }) } } } ​ ● route.html前端页面代码。 <!-- route.html --> <!DOCTYPE html> <html> <body> <div> <a href="native://pages/ProfilePage">个人中心</a> </div> </body> </html> ​ ● 跳转页面ProfilePage.ets代码。 @Entry @Component struct ProfilePage { @State message: string = 'Hello World'; build() { Column() { Text(this.message) .fontSize(20) } } } 跨应用跳转 Web组件可以实现点击前端页面超链接跳转到其他应用。 在下面的示例中,点击call.html前端页面中的超连接,跳转到电话应用的拨号界面。 ​ ● 应用侧代码。 // xxx.ets import web_webview from '@ohos.web.webview'; import call from '@ohos.telephony.call'; @Entry @Component struct WebComponent { webviewController: web_webview.WebviewController = new web_webview.WebviewController(); build() { Column() { Web({ src: $rawfile('xxx.html'), controller: this.webviewController}) .onUrlLoadIntercept((event) => { let url: string = event.data as string; // 判断链接是否为拨号链接 if (url.indexOf('tel://') === 0) { // 跳转拨号界面 call.makeCall(url.substring(6), (err) => { if (!err) { console.info('make call succeeded.'); } else { console.info('make call fail, err is:' + JSON.stringify(err)); } }); return true; } return false; }) } } } ​ ● 前端页面call.html代码。 <!-- call.html --> <!DOCTYPE html> <html> <body> <div> <a href="tel://xxx xxxx xxx">拨打电话</a> </div> </body> </html> 本文由博客一文多发平台 OpenWrite 发布!

优秀的个人博客,低调大师

BeetlSQL 3.22.0 发布,支持 XML 管理 SQL 文件

支持XML设置ResultMap映射,参考文档说明 更新beetl到最新版本,支持更友好的出错提示 <sql id="testSql"> select * from sys_user where 1=1 <isBlank value="name"> and name='lijz' </isBlank> </sql> <resultMap id="complexMap"> <result property="id" column="id"/> <!-- 剩下字段映射到Info对象 --> <association property="info" > <result property="name" column="name"/> <result property="age" column="age"/> </association> </resultMap> <resultMap id="complexListMap"> <result property="id" column="id"/> <collection property="listInfo" > <result property="name" column="name"/> <result property="age" column="age"/> </collection> </resultMap> maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.22.0-RELEASE</version> </dependency> BeetlSQL 自主研发自 2015 年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于 MyBatis。你不想写 SQL 也好,或者想更好地写 SQL 也好,BeetlSQL 都能满足这要求,目前支持的数据库如下 传统数据库:MySQL (包括支持 MySQL 协议的各种数据库), MariaDB ,Oralce ,Postgres (包括支持 Postgres 协议的各种数据库), DB2 , SQL Server ,H2 , SQLite , Derby ,神通,达梦,华为高斯,人大金仓,PolarDB,GBase8s,GreatSQL 等 大数据:HBase,ClickHouse,Cassandar,Hive,GreenPlum 物联网时序数据库:Machbase,TD-Engine,IotDB SQL 查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 如下测试使用了最新的 Hibernate,MyBatis,包含了常用的 orm 操作: 多表联合查询映射(complexMapping),直接执行 sql (executeJdbc), 执行模板 sql (executeTemplate), 执行文件中的模板 sql ( File), 内置插入(insert),Query 调用链 (Query), 翻页查询 (pageQuery), 内置主键查询 (selectById), one2Many 自动关联查询 Benchmark Mode Cnt Score Error Units JMHMain.beetlsqlComplexMapping thrpt 2 207.914 ops/ms JMHMain.beetlsqlExecuteJdbc thrpt 2 496.413 ops/ms JMHMain.beetlsqlExecuteTemplate thrpt 2 456.779 ops/ms JMHMain.beetlsqlFile thrpt 2 424.703 ops/ms JMHMain.beetlsqlInsert thrpt 2 254.596 ops/ms JMHMain.beetlsqlLambdaQuery thrpt 2 230.682 ops/ms JMHMain.beetlsqlOne2Many thrpt 2 122.058 ops/ms JMHMain.beetlsqlPageQuery thrpt 2 193.937 ops/ms JMHMain.beetlsqlSelectById thrpt 2 421.610 ops/ms JMHMain.jdbcExecuteJdbc thrpt 2 1041.376 ops/ms JMHMain.jdbcInsert thrpt 2 332.804 ops/ms JMHMain.jdbcSelectById thrpt 2 1048.165 ops/ms JMHMain.jpaExecuteJdbc thrpt 2 92.327 ops/ms JMHMain.jpaExecuteTemplate thrpt 2 136.409 ops/ms JMHMain.jpaInsert thrpt 2 61.157 ops/ms JMHMain.jpaOne2Many thrpt 2 98.182 ops/ms JMHMain.jpaPageQuery thrpt 2 124.133 ops/ms JMHMain.jpaSelectById thrpt 2 295.552 ops/ms JMHMain.mybatisComplexMapping thrpt 2 99.312 ops/ms JMHMain.mybatisExecuteTemplate thrpt 2 212.699 ops/ms JMHMain.mybatisFile thrpt 2 166.106 ops/ms JMHMain.mybatisInsert thrpt 2 152.376 ops/ms JMHMain.mybatisLambdaQuery thrpt 2 9.545 ops/ms JMHMain.mybatisPageQuery thrpt 2 68.617 ops/ms JMHMain.mybatisSelectById thrpt 2 251.361 ops/ms JMHMain.weedExecuteJdbc thrpt 2 402.270 ops/ms JMHMain.weedExecuteTemplate thrpt 2 426.764 ops/ms JMHMain.weedFile thrpt 2 440.994 ops/ms JMHMain.weedInsert thrpt 2 232.100 ops/ms JMHMain.weedLambdaQuery thrpt 2 335.052 ops/ms JMHMain.weedPageQuery thrpt 2 216.811 ops/ms JMHMain.weedSelectById thrpt 2 359.930 ops/ms 阅读文档源码和例子在线体验多库使用性能测试

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册