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

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. 实现

主要分为以下几个步骤

使用 DBMS_SQL.to_cursor_number 获取游标ID

使用 DBMS_SQL.DESCRIBE_COLUMNS 获取列数以及列信息

使用 DBMS_SQL.DEFINE_COLUMN 循环定义列类型

使用 DBMS_SQL.FETCH_ROWS 遍历数据

使用 DBMS_SQL.COLUMN_VALUE 获取每一列值

使用 DBMS_SQL.CLOSE_CURSOR 关闭游标

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

-- author : herbert 公众号: 小满小慢 日期: 2025-11-11

type 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);

具体测试代码如下

declare

v_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;

BEGIN

open v_p_refcursor FOR

select '小游戏1' F_A, '地心侠士' F_B

from dual

union all

select '小游戏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 LOOP

DBMS_SQL.DEFINE_COLUMN(v_cursor_id, i, v_value, 4000);

END LOOP;

WHILE DBMS_SQL.FETCH_ROWS(v_cursor_id) > 0 LOOP

v_row_data := '';

FOR i IN 1 .. v_col_count LOOP

DBMS_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);

EXCEPTION

WHEN OTHERS THEN

IF DBMS_SQL.IS_OPEN(v_cursor_id) THEN

DBMS_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": "小满小慢"

}]

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

http://www.cnnetsun.cn/news/49245.html

相关文章:

  • AMD GPU并行通信技术:突破性性能优化实战指南
  • Everywhere AI助手:跨平台智能对话系统深度解析
  • 考古学开放数据中的Paradata研究——CAPTURE项目与文献综述解读
  • 论文解读|将1930年前所有阿拉伯期刊添加到Wikidata——学术众包项目Jarāʾid向数字公共领域的迁移
  • 5分钟掌握UpSetR:超越维恩图的集合交集可视化神器
  • 机构洗盘拼合指标绝无未来 源码分析
  • Android项目架构完整指南:模块化开发与Kotlin最佳实践
  • Horovod Process Sets:让千亿参数模型训练触手可及
  • 5步掌握Loco+Tauri:构建高性能跨平台桌面应用的终极指南
  • 如何在Zephyr RTOS中制定最佳编译策略?
  • 专业实验室改造,必须避开的5大坑
  • 千万注意!实验室装修这5个关键点不容忽视
  • 关于指纹浏览器
  • ModelScope 模型一键上线?FunModel 让你 5 分钟从零到生产
  • 云服务器与传统服务器
  • Step-Audio 2:颠覆性多模态音频AI如何重新定义人机交互?
  • 3步掌握OpenUSD在Blender中的高效应用方法
  • HeyGem.ai视频生成超时终极解决方案:从卡顿到流畅的完整优化指南
  • AI智能体测试终极指南:构建可靠质量保障体系
  • 通信基站抛物面天线检测--基于RPN与FPN的改进算法实现
  • CosyVoice ONNX模型部署终极指南:5大实战技巧快速掌握
  • 字节跳动开源Bamboo-mixer:AI驱动电解液研发革命,周期缩短60%
  • 后端学习笔记
  • Gitea权限管理:构建安全高效的代码访问控制体系
  • AI视频生成终极指南:从零开始快速上手WAN2.2-14B-Rapid-AllInOne
  • Ascend C 编译器内幕与自动调优实战:从手写 Kernel 到 AI 驱动的性能优化
  • Ascend C 绿色计算与边缘部署:面向低碳 AI 的极致能效优化实践
  • Step-Audio 2系列深度实战指南:多模态音频理解的技术突破与应用全景
  • 量子计算终极指南:如何用Qiskit快速掌握量子编程的完整教程
  • React-chartjs-2 实战深度突破:从数据混沌到可视化洞察的架构思维