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;