当前位置: 首页 > news >正文

ORACLE解析游标生成JSON

ORACLE解析游标生成JSON

1. 背景

存储过程中使用oracleutl_http调用rest接口,并以JSON的方式传输数据.此需求下,业务和环境有如下限制:

  • 业务已经通过sys_refcursor生成了业务数据,不希望重新编写存储过程
  • 当前ORACLE版本为11G,不支持JSON操作

2. 思路

需要将游标转换为文本,有以下两个方法

  • 使用游标生成XML,从XML转JSON,比较繁琐,如何生成XML,可参考ORACLE游标序列化
  • 直接解析sys_refcursor,生成JSON数据,比较合理

第一种方法,适合接口为xml正文的接口,比如SOAP协议接口.若需要接口为json正文,还需要将XML转为JSON.需要掌握Oracle中的XML操作

第二种方法,直接转成JSON文本,需要借助DBMS_SQL解析游标数据

不管使用哪种方法,接口传输多为大文本,需要使用DBMS_LOB对文本进行文本操作

3. 实现

主要分为以下几个步骤

  1. 使用 DBMS_SQL.to_cursor_number 获取游标ID
  2. 使用 DBMS_SQL.DESCRIBE_COLUMNS 获取列数以及列信息
  3. 使用 DBMS_SQL.DEFINE_COLUMN 循环定义列类型
  4. 使用 DBMS_SQL.FETCH_ROWS 遍历数据
  5. 使用 DBMS_SQL.COLUMN_VALUE 获取每一列值
  6. 使用 DBMS_SQL.CLOSE_CURSOR 关闭游标

其中能获取到到列信息如下

 -- author : herbert 公众号: 小满小慢 日期: 2025-11-11type desc_rec is record (col_type            binary_integer := 0,col_max_len         binary_integer := 0,col_name            varchar2(32)   := '',col_name_len        binary_integer := 0,col_schema_name     varchar2(32)   := '',col_schema_name_len binary_integer := 0,col_precision       binary_integer := 0,col_scale           binary_integer := 0,col_charsetid       binary_integer := 0,col_charsetform     binary_integer := 0,col_null_ok         boolean        := TRUE);

具体测试代码如下

declarev_cursor_id   NUMBER;v_col_count   BINARY_INTEGER;v_col_desc    DBMS_SQL.DESC_TAB;v_value       VARCHAR2(4000);v_row_data    VARCHAR2(4000);v_p_refcursor sys_refcursor;
BEGINopen v_p_refcursor FORselect '小游戏1' F_A, '地心侠士' F_Bfrom dualunion allselect '小游戏2', '地心侠士'from dual;v_cursor_id := DBMS_SQL.to_cursor_number(v_p_refcursor);DBMS_SQL.DESCRIBE_COLUMNS(v_cursor_id, v_col_count, v_col_desc);FOR i IN 1 .. v_col_count LOOPDBMS_SQL.DEFINE_COLUMN(v_cursor_id, i, v_value, 4000);END LOOP;WHILE DBMS_SQL.FETCH_ROWS(v_cursor_id) > 0 LOOPv_row_data := '';FOR i IN 1 .. v_col_count LOOPDBMS_SQL.COLUMN_VALUE(v_cursor_id, i, v_value);v_row_data := v_row_data ||v_col_desc(i).col_name|| ': ' || v_value ;END LOOP;DBMS_OUTPUT.PUT_LINE(v_row_data);END LOOP;DBMS_SQL.CLOSE_CURSOR(v_cursor_id);
EXCEPTIONWHEN OTHERS THENIF DBMS_SQL.IS_OPEN(v_cursor_id) THENDBMS_SQL.CLOSE_CURSOR(v_cursor_id);END IF;RAISE;
END;

输出内容如下

F_A : 小游戏F_B : 地心侠士
F_A : 公众号F_B : 小满小慢

我们最终想要的JSON格式如下

[{"F_A": "小游戏","F_B": "地心侠士"
}, {"F_A": "公众号","F_B": "小满小慢"
}]

通过上边的示列代码简单修改就完全可以实现了.

4. 总结

我在ORACLE游标序列化中实现了游标转XML文本,可以实现多个动态游标的合并.当时就考虑如何生成JSON文本,没有找到合适的方法.当真实的业务诉求出现以后,结合AI问答,找到了一个实际可行的方法.
需要完整游标转JSON的过程,请关注公众号小满小慢,回复游标转JSON获取完整代码.
原文地址: https://mp.weixin.qq.com/s/9pE3C6TURYNoKVvyhvPj8A

http://www.jsqmd.com/news/37759/

相关文章:

  • 习题解析之:鸡兔同笼
  • 如何选择锡林郭勒西林瓶灌装旋盖机?环境温湿度要求详解
  • DeepSeek权威测评榜单2025年11月最新geo优化公司推荐
  • ECB33-PGB2N4E32-I单板机智能交通监控应用方案解析
  • 北京GEO优化服务商2025权威推荐:抢占AI搜索流量新入口
  • 雅思报班哪个机构比较好?过来人分享选择经验与价格课程对比
  • 深入解析:第三方课题验收测试机构:【API测试工具Apifox使用指南】
  • 云原生周刊丨runc 三大高危漏洞曝光
  • Web Worker 入门指南
  • 鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践
  • 通用cursor rules总结
  • 【JVS更新日志】开源框架升级vue 3、低代码、企业计划、智能BI及其他产品迎来新版本! - 实践
  • 银川西林瓶灌装旋盖机推荐2025,运行稳定连续8小时无故障
  • 【ACM出版 | EI检索稳定】2025年人工智能、业务转型和数据科学创新国际学术会议(ICBTDS 2025)
  • echarts 树形结构图实例
  • pg_hba.conf配置里peer,indent和md5的区别
  • 基于Simulink的双电机PID控制仿真实现方案
  • 锡林郭勒西林瓶灌装清洗耗材月成本分析?查行情享优惠
  • AI Agent OS 探索有价值的论文分析(1):Sleep-time Compute
  • Linux内核架构浅谈26-Linux实时进程调度:优先级反转与解决实用的方案
  • 宏定义的高级应用
  • 被问性能后,我封装了这个 PHP 错误上报工具
  • 公众号中的贴纸素材有什么作用?在哪里找?
  • 国标GB28181算法算力平台EasyGBS:深度解析全场景视频调阅功能与行业实战应用
  • 2025出国留学机构综合实力榜:排名前十的留学中介特色分析
  • 公众号怎么起爆款标题?有什么好用的工具?
  • 邢台西林瓶灌装机优选指南:聚焦资质、案例与售后
  • 基于SpringBoot+Vue的个人理财系统管理系统设计与建立【Java+MySQL+MyBatis完整源码】
  • python使用PyInstaller打包成exe
  • 2025年机械磨优质厂家权威推荐榜单:冲击磨/小型机械磨/超微机械磨源头厂家精选