问题描述
嗨,
我有一些PL/SQL函数,它们具有SYS_REFCURSOR的返回类型。游标不能强类型,因为它们表示的SQL是在PL/SQL中动态生成的,因此每次调用的列数和数据类型可能不同。
我想将弱光标表示的所有数据转换为JSON数组。我认为我不能使用提取来绕过光标,因为光标的结构是未知的。有没有一种方法可以做到这一点,以便Oracle可以在运行时计算出游标的结构是什么?我在想下面的代码,但我不能让它工作。对于任何错别字,请提前道歉:
希望你能帮我,
马克。
我有一些PL/SQL函数,它们具有SYS_REFCURSOR的返回类型。游标不能强类型,因为它们表示的SQL是在PL/SQL中动态生成的,因此每次调用的列数和数据类型可能不同。
我想将弱光标表示的所有数据转换为JSON数组。我认为我不能使用提取来绕过光标,因为光标的结构是未知的。有没有一种方法可以做到这一点,以便Oracle可以在运行时计算出游标的结构是什么?我在想下面的代码,但我不能让它工作。对于任何错别字,请提前道歉:
DECLARE
FUNCTION get_source
RETURN SYS_REFCURSOR
IS
v_retval SYS_REFCURSOR;
BEGIN
OPEN v_retval FOR SELECT * FROM SYS.DUAL;
RETURN(v_retval);
END get_source;
BEGIN
DECLARE
v_blob BLOB;
v_rc SYS_REFCURSOR;
BEGIN
v_rc := get_source();
SELECT JSON_ARRAYAGG(JSON_OBJECT(*) RETURNING BLOB) INTO v_retval FROM (CURSOR(v_rc));
END;
/希望你能帮我,
马克。
专家解答
您可以使用APEX_JSON将任意游标转换为JSON:
在select中使用游标表达式获取行内的数组:
declare
cur sys_refcursor;
begin
open cur for
select level l
from dual
connect by level <= 3;
apex_json.initialize_clob_output ( p_indent => 2 );
apex_json.open_object;
apex_json.write ( 'rws', cur );
apex_json.close_object;
dbms_output.put_line ( apex_json.get_clob_output () );
apex_json.free_output;
end;
/
{
"rws":[
{
"L":1
}
,{
"L":2
}
,{
"L":3
}
]
}在select中使用游标表达式获取行内的数组:
declare
cur sys_refcursor;
begin
open cur for
select level rn, cursor (
select level rn from dual
connect by level <= 3
) vals
from dual
connect by level <= 2;
apex_json.initialize_clob_output ( p_indent => 2 );
apex_json.open_object;
apex_json.write ( 'rws', cur );
apex_json.close_object;
dbms_output.put_line ( apex_json.get_clob_output () );
apex_json.free_output;
end;
/
{
"rws":[
{"RN":1,"VALS":[{"RN":1},{"RN":2},{"RN":3}]},
{"RN":2,"VALS":[{"RN":1},{"RN":2},{"RN":3}]}
]
} 文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




