news 2025/12/31 11:03:30

ORACLE解析游标生成JSON

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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": "小满小慢"

}]

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/30 12:32:42

AMD GPU并行通信技术:突破性性能优化实战指南

AMD GPU并行通信技术:突破性性能优化实战指南 【免费下载链接】JumpServer 广受欢迎的开源堡垒机 项目地址: https://gitcode.com/feizhiyun/jumpserver 在当今AI大模型训练和科学计算领域,多GPU并行计算已成为标配。然而,当您面对AMD…

作者头像 李华
网站建设 2025/12/30 19:15:48

Everywhere AI助手:跨平台智能对话系统深度解析

Everywhere AI助手:跨平台智能对话系统深度解析 【免费下载链接】Everywhere Seamless AI Assistant that brings your Favorite LLM in Every app, Every time, Every where. 项目地址: https://gitcode.com/GitHub_Trending/ever/Everywhere 在当今AI技术飞…

作者头像 李华
网站建设 2025/12/14 11:51:51

考古学开放数据中的Paradata研究——CAPTURE项目与文献综述解读

考古学开放数据中的Paradata研究——CAPTURE项目与文献综述解读 文章基本信息 标题:Paradata传达对工作流程的理解并促进艺术与人文学科研究数据的重用:CAPTURE项目 作者:Isto Huvila 作者单位:乌普萨拉大学 出版日期&#x…

作者头像 李华
网站建设 2025/12/23 14:29:28

5分钟掌握UpSetR:超越维恩图的集合交集可视化神器

5分钟掌握UpSetR:超越维恩图的集合交集可视化神器 【免费下载链接】UpSetR An R implementation of the UpSet set visualization technique published by Lex, Gehlenborg, et al.. 项目地址: https://gitcode.com/gh_mirrors/up/UpSetR UpSetR是一个强大的…

作者头像 李华
网站建设 2025/12/23 12:15:53

机构洗盘拼合指标绝无未来 源码分析

{}VAR01:LLV(L,10); VAR02:HHV(H,25); 趋势线:EMA((C-VAR01)/(VAR02-VAR01)*4,4); 价:EMA(MA((((C-REF(C,1))(H-REF(H,1))(L-REF(L,1)))/3)/C,5),1); 价5:MA(价,5); 量:EMA(MA((V-REF(V,1))/V,5),1); 量5:MA(量,5); 角:1>(ATAN((C/REF(C,1)-1)*100)*180/3.14115926)>-1; …

作者头像 李华