惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
U
Unit 42
M
MIT News - Artificial intelligence
小众软件
小众软件
P
Proofpoint News Feed
雷峰网
雷峰网
L
LangChain Blog
S
SegmentFault 最新的问题
腾讯CDC
F
Fortinet All Blogs
A
About on SuperTechFans
WordPress大学
WordPress大学
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog

博客园 - _herbert

小程序拍证件并局部裁剪 信创-为什么ORACLE使用JDBC查询SYSDATE时,RS.getDate能获取到时间部分? linux宝塔面板使用API自动部署更新文件 JSON JAVA找出哪个类import了不存在的类 LocalDate,LocalDateTime,Date,日期串相互转换 PostMan加载三方JS PostMan内置对象 微信支付集成_JSAPI VUE中使用AXIOS包装API代理 spring中el表达式安全和扩展 Spring使用el表达式 springboot中File默认路径 Springboot启动时记录进程ID ORACLE解析游标生成JSON AI教我一条SQL实现明细转树形结构 Springboot构建包使用BOOT-INF中的class覆盖依赖包中的class Maven 构建知识库 MAVEN构建分离依赖JAR JAVA实现读取最后几行日志 信创-ORACLE迁移到KingbaseV9 信创-ORACLE迁移到DM8 sql分组 group by rollup,cube,grouping sets,group_id,groupingId
ORACLE游标序列化
_herbert · 2025-11-07 · via 博客园 - _herbert

ORACLE游标序列化

ORACLE中可以直接调用接口,需要把数据构造成xml格式,方便请求参数构造.比如在使用select utl_http.request('http://www.baidu.com') from dual可以访问百度页面

1. 使用DBMS_XMLGEN序列化

declare
  ctx DBMS_XMLGEN.CTXHANDLE;
  c_result CLOB;
  v_source SYS_REFCURSOR; 
BEGIN
  OPEN v_source FOR 
  select '小游戏1' F_A,'地心侠士' F_B from dual
  union all
  select '小游戏2','地心侠士' from dual;
  ctx := DBMS_XMLGEN.newcontext(v_source);
  -- 20251107 公众号 小满小慢
  -- 设置顶层节点,可以使用默认值(不设置默认 ROWSET 和 ROW)
  DBMS_XMLGEN.setrowsettag(ctx, 'EMPLOYEES'); 
  DBMS_XMLGEN.setrowtag(ctx, 'EMPLOYEE'); 
  c_result := DBMS_XMLGEN.getxml(ctx);
  DBMS_OUTPUT.PUT_LINE(SUBSTR(c_result, 1, 2000)); 
  DBMS_XMLGEN.closecontext(ctx);
  CLOSE v_source;
END xml_print;

返回结果,注意顶层节点为EMPLOYEES,行节点为EMPLOYEE

<?xml version="1.0"?>
<EMPLOYEES>
 <EMPLOYEE>
  <F_A>小游戏1</F_A>
  <F_B>地心侠士</F_B>
 </EMPLOYEE>
 <EMPLOYEE>
  <F_A>小游戏2</F_A>
  <F_B>地心侠士</F_B>
 </EMPLOYEE>
</EMPLOYEES>

2.使用xmltype序列化

declare
  x       xmltype;
  ref_cur SYS_REFCURSOR;
begin
  OPEN ref_cur FOR
    select 'a1' F_A, 'b1' F_B from dual
    union all
    select 'a2', 'b2' from dual;
  x := xmltype(ref_cur);
  Dbms_Output.put_line(x.getClobVal());
end;

返回结果

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <F_A>a1</F_A>
  <F_B>b1</F_B>
 </ROW>
 <ROW>
  <F_A>a2</F_A>
  <F_B>b2</F_B>
 </ROW>
</ROWSET>

3. 序列化JSON

目前没有找到游标直接转换JSON的的实现方式,如果要实现动态列,目前可行的方案.如果有大牛实现了,可否告知分享下

-- 20251107 herbert
with t as( 
  select 'a1' F_A,'b1' F_B from dual
  union all
  select 'a2','b2' from dual)
  SELECT JSON_ARRAYAGG(
         JSON_OBJECT(
           'F_A' VALUE F_A,
           'F_B' VALUE F_B)
         )
        AS employees_json
FROM t;

原文地址: https://mp.weixin.qq.com/s/VdPF8p-sNT9--thfP9GLVg