暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 是否可以在弱ref游标而不是表上使用JSON SQL函数

ASKTOM 2020-08-20
277

问题描述

嗨,

我有一些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:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论