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

news2024/11/27 12:59:20

一、前言

使用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 abc
         1 def

SQL> print r2;

      COL1         CT
---------- ----------
         1          2

SQL> print r3;

      COL1 L
---------- ----------------------------------------------------------------------------------------------------
         1 abc,def

SQL>

如上代码所示,使用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 | abc
    1 | 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.coloradmin.cn/o/1599667.html

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

相关文章

Fiddler安装与使用的深度解析

在现今的互联网开发领域&#xff0c;无论是前端开发、后端开发&#xff0c;还是移动应用开发&#xff0c;对HTTP协议的深入理解和应用都至关重要。而在这个过程中&#xff0c;一个强大的HTTP调试代理工具就显得尤为关键。Fiddler&#xff0c;作为一款功能强大的网络调试工具&am…

数据库练习(二)

建表 create table employee(empno int primary key auto_increment , ename char(10) , job char(6) , mgr int , hiredate date , sal float(10,2),comm float(10,2),deptno int ); insert into employee(empno…

【简单介绍下单片机】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

元类的执行

class MetaB(type):def __new__(cls, name, bases, attrs):print(f"使用元类 {cls.__name__} 创建{name}类 ")return super().__new__(cls, name, bases, attrs)class A(metaclassMetaB):passclass C(A):pass元类MetaB的__new__方法应该只会在创建类A时被调用一次, 因…

集成电路测试学习

集成电路&#xff08;Integrated Circuit&#xff0c;IC&#xff09;整个设计流程包括&#xff1a;电路设计、晶圆制造、晶圆测试、IC封装、封装后测试。 IC测试目的&#xff1a;一、确认芯片是否满足产品手册上定义的规范&#xff1b;二、通过测试测量&#xff0c;确认芯片可以…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

Unity架构师进阶:红点系统的架构与设计

面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统&#xff0c;有哪些接口&#xff0c;并完整地给出实现。 红点系统的需求分析 首先我们来分析一下红点系统的设计需求: 红点系统严格意义上来说不属于框架&#xff0c;而是游戏逻辑&#xff0…

DOS时代经典软件,落下帷幕,国产中文编程,蓬勃发展

互联网的变迁好像翻涌的波涛&#xff0c;有些我们以为已经忘掉的软件&#xff0c;其实还留在我们心里&#xff0c;特别是那些经历过从DOS系统换到Windows系统的人&#xff0c;这种感觉更加明显。 说起DOS软件&#xff0c;它是很多80后年轻时的美好记忆。虽然现在它已经成为了过…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出&#xff0c;又称PR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性&#xff0c;优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想&#xff1a; 数量假设&#…

【DA-CLIP】图像退化类型检测功能演示代码

背景 在CLIP基础上微调而来&#xff0c;使用图像控制器编码生成退化类型embedding并在训练中对图像编码器进行控制。针对十种退化类型进行了训练。 解决CLIP模型在图像纹理等层面无法针对退化类型识别或识别率较低的问题。 训练数据集情况 GitHub有对应数据集连接 完整代码 项…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Zhang等人受到自然界鸭群觅食行为启发&#xff0c;提出了鸭群算法&#xff08;Duck Swarm Algorithm, DSA&#xff09;。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

JRT多服务器同步程序

之前的JRT只部署在一个服务器&#xff0c;实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步&#xff0c;但是有个问题是Rsync同步jar之后他不知道是否需要重启站点&#xff0c;为此实现java控制台驱动Rsync&#xff0c;重定…

滤波器笔记(杂乱)

线性相位是时间平移&#xff0c;相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…

【题解】AB5 点击消除(C++)

把string当栈用&#xff0c;扫一遍就可以了&#xff0c;时间复杂度O(n) #include <iostream> #include <string> using namespace std;int main() {string s;cin >> s;int n s.size();string st;for (int i 0; i < n; i) {if (st.empty() || st.back()…

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

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

代码随想录算法训练营第四十二天| 二维背包、一维背包、LeetCode 416.分割等和子集

一、二维背包 文章讲解/视频讲解&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 状态&#xff1a;已解决 1.背包问题介绍 背包问题实则是一类问题的集合&#xff0c;有好多不同小类型&#xff0c…

Linux_iptables防火墙学习笔记

文章目录 iptables 概述四表五链iptables 安装启动iptables 配置详解iptables配置文件iptables配置语法iptables常用实例查看规则修改默认规则保存和备份规则恢复备份的规则清空规则放行SSH服务在ubuntu14.04中iptables规则持久化 iptables 概述 主机型 对主机进行保护 网络型…

Element-Ui的Form表单:Label文本两端对齐,且必填项的*不影响布局

1. HTML 结构 首先&#xff0c;确保你的 HTML 或 Vue 模板中有一个 el-form 组件&#xff0c;类似下面这样&#xff1a; <div id"app"><el-form :model"form" label-width"100px"><el-form-item label"用户名">&l…

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

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

JCVI-筛选blast最佳结果(生物信息学工具-015)

通常&#xff0c;大家会问我们经过了NR注释&#xff0c;SwissProt注释&#xff0c;那么如何进行&#xff0c;如何挑选最佳比对结果&#xff1f; 同理&#xff0c;存在一个问题&#xff0c;如何挑选最佳的blast比对结果&#xff1f;什么事最优的同源序列&#xff1f; 唐海宝老…