ORACLE游标序列化

ORACLE游标序列化

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

1. 使用DBMS_XMLGEN序列化

sql 复制代码
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 复制代码
<?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序列化

sql 复制代码
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 复制代码
<?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的的实现方式,如果要实现动态列,目前可行的方案.如果有大牛实现了,可否告知分享下

sql 复制代码
-- 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