【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,一经查实,立即删除!

相关文章

项目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中行得通&#…

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

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

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

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

基于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;都不行。最后只能…

目标检测算法——YOLOV9——算法详解

一、主要贡献 深度网络输入数据在逐层进行特征提取和空间变换时&#xff0c;会丢失大量的信息。针对 信息丢失问题&#xff0c;研究问题如下&#xff1a; 1&#xff09;从可逆功能的角度对现有深度神经网络架构进行了理论分析&#xff0c;解释了许多过去难以解释的现象&#xf…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

Module Federation微前端应用拆分后 - request请求优化、私有化request|分发拦截器

1. 背景及目的 1.1 需求背景 随着应用的拆分&#xff0c;目前子应用有12个&#xff0c;这些子应用都使用的是同一个request实例。 前端支持后端切流&#xff0c;增加多个拦截器用于灰度 经手动梳理&#xff1a; 目前所有应用中有26个在使用的拦截器&#xff0c; 其中用于灰…

imgcat 工具

如果经常在远程服务器或嵌入式设备中操作图片&#xff0c;要查看图片效果&#xff0c;就要先把图片dump到本地&#xff0c;比较麻烦。可以使用这个工具&#xff0c;直接在终端上显示。类似于这种效果。 imgcat 是一个终端工具&#xff0c;使用 iTerm2 内置的特性&#xff0c;允…

加强fou循环的坑

今天遇到了一个有趣的事情&#xff0c;使用加强fou循环操作list时&#xff0c;会报错并发操作异常。 直到看了编译类&#xff0c;才发现&#xff0c;加强fou循环其实就是通过迭代器操作&#xff1a; 这里就会出现一个问题&#xff0c;迭代器在取出值时&#xff0c;就回去检测这…

【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)

目录 【数据结构】遍历二叉树&#xff08;递归和非递归遍历的先序、中序和后序遍历、层次遍历法&#xff09;一、递归算法先&#xff08;根&#xff09;序的遍历算法中&#xff08;根&#xff09;序的遍历算法后&#xff08;根&#xff09;序的遍历算法 二、非递归算法层次遍历…

【漏洞复现】浙大恩特客户资源管理系统 i0004_openFileByStream.jsp 任意文件读取漏洞

0x01 产品简介 浙大恩特客户资源管理系统是一款外贸管理软件&#xff0c;它提供了多种功能&#xff0c;包括客户档案管理、邮件管理、OA外贸办公管理系统、分管权限管理、联系跟进及提醒、业务检查管理、统计分析管理等。 0x02 漏洞概述 浙大恩特客户资源管理系统存在任意文件…

ENSP-旁挂式AC

提醒&#xff1a;如果AC不能成功上线AP&#xff0c;一般问题不会出在AC上&#xff0c;优先关注AC-AP线路上的二层或三层组网的三层交换机 拓扑图 管理VLAN&#xff1a;99 | 业务VLAN&#xff1a;100 注意点&#xff1a; 1.连接AP的接口需要打上pvid为管理vlan的标签 2.AC和…