news 2026/5/26 9:45:47

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 8:14:32

C语言编译过程 ELF文件加载过程解析

C语言编译 - ELF文件加载过程解析bin 文件通常用于嵌入式裸机程序的烧录,elf 可执行文件通常运行在操作系统之上。bin 是扁平的二进制文件,没有任何说明,它假设加载它的环境(如嵌入式引导程序,BootRom)已经…

作者头像 李华
网站建设 2026/5/25 23:00:06

如何通过API密钥轮询机制实现负载均衡与系统稳定性提升

如何通过API密钥轮询机制实现负载均衡与系统稳定性提升 【免费下载链接】big-AGI 💬 Personal AI application powered by GPT-4 and beyond, with AI personas, AGI functions, text-to-image, voice, response streaming, code highlighting and execution, PDF i…

作者头像 李华
网站建设 2026/5/26 2:37:17

终极指南:10分钟用HandyControl构建专业级WPF聊天应用

终极指南:10分钟用HandyControl构建专业级WPF聊天应用 【免费下载链接】HandyControl Contains some simple and commonly used WPF controls 项目地址: https://gitcode.com/gh_mirrors/ha/HandyControl 想要快速构建一个现代化的WPF聊天应用吗?…

作者头像 李华
网站建设 2026/5/26 5:55:37

GitHub一小时速成指南:从零基础到熟练操作

GitHub一小时速成指南:从零基础到熟练操作 【免费下载链接】introduction-to-github Get started using GitHub in less than an hour. 项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-github 还记得第一次接触GitHub时的困惑吗&#xf…

作者头像 李华
网站建设 2026/5/26 7:22:46

终极邮件编辑器:轻松拖拽,快速打造专业级邮件

终极邮件编辑器:轻松拖拽,快速打造专业级邮件 【免费下载链接】easy-email-editor Easy Email Editor is a feature-rich, top open-source SaaS email editor based on React and MJML. 项目地址: https://gitcode.com/gh_mirrors/ea/easy-email-edit…

作者头像 李华