【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式

一、前言

使用ORACLE作为数据库的应用软件中,偶尔会遇到使用游标作为出参的存储过程,这种存储过程迁移到MogDB并不需要进行改造,但是在开发这样的存储过程时,开发人员偶尔会想要在数据库中测试执行一下,看看游标中的数据是否符合预期,但游标并不是常规的基本数据类型,再写一段plsql或者其他语言的代码去扫游标中的数据打印出来又会有额外的开发量。因此本文介绍几种在开发过程中,ORACLE和MogDB查看出参游标数据的方式。

二、测试对象创建

以下代码在ORACLE和MogDB(A模式)中均可执行

--创建测试表并插入数据
create table t_test_cursor1(col1 number,col2 varchar2(100));
insert into t_test_cursor1 values (1,'abc');
insert into t_test_cursor1 values (1,'def');
commit;--创建带出参游标的package
create or replace package pkg_test_mutil_cursor is
procedure proc (a int,
c1 out sys_refcursor,
c2 out sys_refcursor,
c3 out sys_refcursor);
end;
/create or replace package body pkg_test_mutil_cursor is
procedure proc (a int,
c1 out sys_refcursor,
c2 out sys_refcursor,
c3 out sys_refcursor) is
begin
open c1 for select *  from t_test_cursor1 where col1=a;
open c2 for select col1 ,count(1) ct from t_test_cursor1 where col1=a group by col1;
open c3 for select col1,substr(listagg(col2,',') within group(order by col2),1,100) l from t_test_cursor1 where col1=a group by col1;
end;  
end;
/

三、Oracle查看游标中数据的方式

1.sqlplus

此方法适用于无其他客户端工具,仅有数据库自带客户端sqlplus时使用

SQL> set linesize 200
SQL> var r1 refcursor;
SQL> var r2 refcursor;
SQL> var r3 refcursor;
SQL> exec pkg_test_mutil_cursor.proc(1,:r1,:r2,:r3);PL/SQL 过程已成功完成。SQL> print r1;COL1 COL2
---------- --------------------------------------------------1 abc1 defSQL> print r2;COL1         CT
---------- ----------1          2SQL> print r3;COL1 L
---------- ----------------------------------------------------------------------------------------------------1 abc,defSQL>

如上代码所示,使用var声明变量和变量的类型,然后使用exec命令(exec/execute/call都行)执行这个procedure,最后再使用print命令打印变量。
需要注意的是,这个用例中出现的set /var/exec/print 这四个命令都不是oracle的sql语法中有的,这4个都是sqlplus这个客户端里的语法,因此无法在其他开发语言中使用sql执行接口来调用。
另外,这里的print会把游标中的所有数据都打印出来,如果游标数据量很大,sqlplus会疯狂刷屏。

2.dbms_sql.return_result

oracle 12c新增了dbms_sql.return_result功能,可以在sqlplus中执行存储过程后直接显示结果集中的数据(可以参考mysql的存储过程里直接select查数据的用法),但是由于其本身就已经fetch完了,因此游标已不能再使用。另外oracle还支持ResultSet,这里就不过多介绍了,因为return_result和resultset功能需要修改原存储过程,而且应用开发的时候还得使用新的接口来处理这个数据交互,不具有通用性。详细用法参考oracle官方文档 using-scripts-in-SQL-Plus

3.PLSQL DEVELOPER

相比前面sqlplus还要额外声明变量打印的方式,PLSQL DEVELOPER的处理方式更人性化一些,只需在调试窗口中直接执行,即可逐个打开变量查看游标中的数据

屏幕截图 2024-04-13 170412.png

屏幕截图 2024-04-13 170620.png

屏幕截图 2024-04-13 170656.png

但是这里注意,游标的数据窗口关闭后,再打开就无法看到里面的数据了

4.Oracle sql developer

和plsql developer一样,Oracle官方的Oracle sql developer,也是通过调试来查看出参游标中的数据,不过并不需要像plsql developer那样打开新的窗口,并且此处切换不同的游标查看并不会出现只能看一次的情况

屏幕截图 2024-04-13 184316.png

四、MogDB查看游标中数据的方式

注:本文使用的MogDB版本为5.0,相关限定条件不一定适用于更高的版本

1.gsql

MogDB=# begin;
BEGIN
MogDB=# call pkg_test_mutil_cursor.proc(1,null,null,null);c1         |         c2         |         c3
--------------------+--------------------+--------------------<unnamed portal 1> | <unnamed portal 2> | <unnamed portal 3>
(1 row)MogDB=# fetch all "<unnamed portal 1>";col1 | col2
------+------1 | abc1 | def
(2 rows)MogDB=# fetch all "<unnamed portal 2>";col1 | ct
------+----1 |  2
(1 row)MogDB=# fetch all "<unnamed portal 3>";col1 |    l
------+---------1 | abc,def
(1 row)MogDB=# end;
COMMIT
MogDB=#

其实这里和postgresql的用法是基本一致的,需要先手动开启一个事务,然后再执行存储过程。不仅可以看到游标中的数据,还能直接操作游标向前向后,只看第一条、只看最后一条、游标计数等,

Fetch ::= FETCH [ direction { FROM | IN } ] cursor_name;
direction ::= NEXT| PRIOR| FIRST| LAST| ABSOLUTE count| RELATIVE count| count| ALL| FORWARD| FORWARD count| FORWARD ALL| BACKWARD| BACKWARD count| BACKWARD ALL

具体可参考MogDB官方文档 FETCH

在gsql中,一般情况下,不需要额外再声明变量,可直接传入常量来call这个存储过程,只要满足参数个数即可。但是需要注意重载的问题,当有同名且参数个数相同的存储过程时,参数位置需要输入指定数据类型的任意值(详见CALL语法)。
关于重载的说明可以参考我之前写的这篇文章 【openGauss】带有out参数的存储过程及自定义函数的重载测试

另外,还要注意一个参数plsql_compile_check_options=‘outparam’,开启此参数后,
出参就只能传变量了,不能使用常量占位(oracle的出参也是不能用常量占位的)。

这里用命令获取游标数据的方式,和ORACLE最大的本质区别,其实在于,MogDB中获取游标的fetch语句,其实是个sql语句,而非客户端命令,因此该方式可以用于其他开发语言甚至图形化客户端中,灵活度大大提高。

2.Mogeaver

得益于开源的dbeaver,Mogeaver在游标查看上也相当方便(这里使用的Mogeaver版本为23.3.0)。
打开一个SQL窗口,开启 手动提交 (默认是自动提交的),然后使用call语句执行存储过程,可以看到出参以结果集的方式返回了,可以直接点到对应的游标名称上,右侧的数值查看器即可展示游标中的数据,无需像plsqldev那样切换窗口来展示(如果使用Mogeaver连接ORACLE来查看出参游标,效果是一样的)

屏幕截图 2024-04-13 180427.png

当然这里如果想用gsql里那样的方式,使用fetch语句来各种操作游标也是可以的,毕竟这里的fetch就是sql语句,执行后就会返回对应的结果。

屏幕截图 2024-04-13 181715.png

总结

很多人在突然面对一个新的东西时,可能会出现不知所措的情况,但是如果去使用了,可能会发现新的东西并不是那么不同,能找到越来越多的相似点。

在Oracle和MogDB中,带有游标出参的存储过程创建语法是完全一致的。而且MogDB也有在开发过程中查看游标数据的多种方式,可以让从Oracle转过来的开发人员能更快适应在MogDB上进行开发。

  • 本文作者: DarkAthena
  • 本文链接: https://www.darkathena.top/archives/mogdb-oracle-procedure-out-cursor-data
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向量数据库中的向量是什么?

在向量数据库中&#xff0c;向量通常指的是高维空间中的点或方向&#xff0c;它们由一组数值组成&#xff0c;这些数值表示该点在空间中的位置或方向。在机器学习和人工智能领域&#xff0c;向量经常用于表示各种类型的数据&#xff0c;如文本、图像、音频等。 具体来说&#x…

项目5-博客系统1(准备工作+博客列表+博客详情页)

1.创建项目 导入以下依赖 2.项目介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个页面 2.1 前端页面展示 2.1.1 用户登录 2.1.2 博客发表页 2.1.3 博客编辑页 2.1.4 博客列表页 2.1.5博客详情页 2.2 功能描述: ⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 <<查看全⽂…

Big Data and Cognitive Computing (IF=3.7) 计算机/大数据/人工智能期刊投稿

Special Issue: Artificial Cognitive Systems for Computer Vision 欢迎计算机/大数据/人工智能/计算机视觉相关工作的投稿&#xff01; 影响因子3.7&#xff0c;截止时间2024年12月31日 投稿咨询&#xff1a;lqyan18fudan.edu.cn 投稿网址&#xff1a;https://www.mdpi.com/j…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好&#xff0c;有幸与屏幕前你们相识&#xff0c;博主现已经搬砖9年&#xff0c;趁着头发还充裕&#xff0c;希望给大家提供一些编程领域的帮助&#xff0c;深知计算机毕业生这个阶段的崩溃与闹心&#xff0c;让我们共同交流进步。 博主给大家列举了项目合集&#…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…

coredump-x: sanitizer编译出现segmentfault

https://bugzilla.redhat.com/show_bug.cgi?id=1669117 https://github.com/dmlc/xgboost/pull/8878 从上面两个链接,看着已经解决了,需要使用新版本的gcc。 https://github.com/dmlc/xgboost/issues/8863 Using only ubsan works. Using only thread sanitizer works. (wi…

本地环境连接虚拟机中的数据库,虚拟机的防火墙允许从本地主机访问虚拟机的MySQL端口

要让本地环境可以访问虚拟机中的数据库&#xff0c;您可以按照以下步骤进行设置&#xff1a; 配置虚拟机网络&#xff1a; 确保虚拟机的网络设置为桥接模式&#xff0c;这样虚拟机可以获得与本地网络相同的IP地址段。 查看虚拟机IP地址&#xff1a; 在虚拟机中运行以下命令来查…

ChatGPT的黑科技让你的论文脱颖而出

ChatGPT无限次数:点击直达 html ChatGPT的黑科技让你的论文脱颖而出 导言 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;ChatGPT作为一款优秀的文本生成模型正逐渐走进人们的视野。本文将介绍如何利用ChatGPT的黑科技让你的论文在激烈的学术竞争中脱颖而出。 …

吴恩达llama课程笔记:第七课llama安全工具

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

依靠ChatGPT打磨优质学术论文的步骤

ChatGPT无限次数:点击直达 依靠ChatGPT打磨优质学术论文的步骤 在当今信息爆炸的时代&#xff0c;学术写作已经成为许多研究者和学生的日常工作。然而&#xff0c;撰写一篇优质的学术论文并非易事&#xff0c;尤其是对于那些想要在学术界取得突破的人来说。幸运的是&#xff0…

.net 6 配置QuartZ定时任务

项目中需要用到QuartZ执行定时任务&#xff0c;在此记录一下学习过程。 Quartz安装 在VS2022中&#xff0c;通过Nuget包管理器安装Quartz 3.8.1 &#xff0c;这是.net 6 依赖的最高版本。 创建定时器任务 1、创建QuartzConfigurator 新建QuartzConfiguratorExtensions类&am…

【笔记】探索生成范式:大型语言模型在信息提取中的作用

探索生成范式&#xff1a;大型语言模型在信息提取中的作用 摘要介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&am…

JRebelXRebel在线激活

包含所有新旧版本&#xff0c;包括2023.4.2、2023.4.1、2023.4.0、2023.3.2、2023.3.1、2023.3.0、2023.2.2、2023.2.1、2023.2.0、2023.1.2、2023.1.1 等以及所有2022版本 JRebel&XRebel激活服务器地址 激活服务器地址&#xff08;路线1,推荐&#xff09; https://jrebe…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码&#xff0c;下载地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后&#xff0c;使用Qt Creator xx&#xff0…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错&#xff0c;跑不起来&#xff0c;类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的&#xff0c;然后项目需要node20的&#xff0c;执行下面的就可以正…

Vue3(二):报错调试,vue3响应式原理、computed和watch,ref,props,接口

一、准备工作调试 跟着张天禹老师看前几集的时候可能会遇到如下问题&#xff1a; 1.下载插件&#xff1a;Vue Language Features (Volar)或者直接下载vue-offical 2.npm run serve时运行时出现错误&#xff1a;Error: vitejs/plugin-vue requires vue (&#xff1e;3.2.13) …

Linux系统(centos,redhat,龙芯,麒麟等)忘记密码,怎么重置密码

Linux系统&#xff08;centos,redhat,龙芯&#xff0c;麒麟等&#xff09;忘记密码&#xff0c;怎么重置密码&#xff0c;怎么设置新的密码 今天在操作服务器时&#xff0c;DBA忘记了人大金仓数据库的kingbase密码&#xff0c;他的密码试了好多遍&#xff0c;都不行。最后只能…

2024-04-16 问AI: 介绍一下卷积网络VGG

某AI罢工了&#xff0c;看来一个AI是不保险的。 看来AI也要高可用。 文心一言 没有成功&#xff0c;提问人数过多。 智谱清言 VGG&#xff08;Visual Geometry Group&#xff09;网络是由牛津大学的视觉几何组提出的一种深层卷积神经网络结构&#xff0c;它在2014年的ImageNe…