news 2026/4/18 4:20:13

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/4/3 23:47:56

深入理解 Linux Namespace:隔离技术的基石

Linux 容器技术(如 Docker)的强大能力并非来自魔法,而是源于 Linux 内核提供的一项核心功能:Namespace。它提供了对系统资源的隔离,是容器能够实现轻量级、便携且安全运行的基石。本文将深入浅出地探讨 Namespace 是什…

作者头像 李华
网站建设 2026/4/9 23:22:37

AutoGPT项目安装常见问题及解决方案汇总

AutoGPT项目安装常见问题及解决方案汇总 在AI从“被动响应”迈向“主动思考”的今天,像AutoGPT这样的自主智能体正逐步走出实验室,进入开发者的本地终端。它不再等待用户一步步下达指令,而是能自己拆解目标、调用工具、反复试错,…

作者头像 李华
网站建设 2026/4/13 17:50:37

《极品家丁七改版》终极珍藏完整版:一键下载无雷精校全本资源

《极品家丁七改版》终极珍藏完整版:一键下载无雷精校全本资源 【免费下载链接】极品家丁七改版珍藏七改加料无雷精校全本资源下载介绍 《极品家丁(七改版)》是一部广受欢迎的经典小说,此版本经过精心校对与优化,保留了…

作者头像 李华
网站建设 2026/4/17 2:55:04

静态博客迁移实战:从WordPress卡顿到Gridea极速体验

你是否经历过这样的场景:在WordPress后台编辑文章时,页面加载缓慢得让人焦躁;每个月都要为服务器续费而心疼钱包;还要时刻担心网站被恶意攻击的风险?如果你正在寻找一种更轻量、更快速、更安全的博客解决方案&#xff…

作者头像 李华