如何清除APEX_JSON编写的json对象

时间:2017-07-20 08:54:58

标签: json plsql oracle11g oracle-apex oracle-apex-5.1

我是ORDS的新手。我正在使用APEX_JSON为我的其余服务创建一个json对象,其源类型为PL / SQL。 我正在创建的json对象很复杂。 如果在创建json对象时出现任何问题,那么我必须返回一个在主体中具有不同json结构的错误。 所以在创建错误的主体之前,我想清除我创建的json,直到这一点。 我怎样才能做到这一点。或者还有其他方法可以实现这一目标。

PROCEDURE GETNODES(I_LOCATION IN NUMBER)
V_STATUS NUMBER;
BEGIN
    APEX_JSON.OPEN_OBJECT;
    APEX_JSON.OPEN_ARRAY('NODES');

    FOR nodes in (select NAME FROM NODES where location = I_LOCATION) LOOP
        APEX_JSON.OPEN_OBJECT;
        APEX_JSON.write('NAME',nodes.name);
        V_STATUS := getnodestatus(nodes.name); --This can throw an exception
        APEX_JSON.write('STATUS',V_STATUS);
        APEX_JSON.CLOSE_OBJECT;
    END LOOP;

    APEX_JSON.CLOSE_ARRAY;
    APEX_JSON.CLOSE_OBJECT;

EXCEPTION WHEN OTHERS THEN
--IF I get any error, then I have to write a different json, so I have to clear the json written till now, how to do it?
    APEX_JSON.OPEN_OBJECT;
    APEX_JSON.write('ERROR CODE',SQLCODE);
    APEX_JSON.write('ERROR MSG',SQLERRM);
    APEX_JSON.CLOSE_OBJECT;
END;

PS:以上代码仅供参考。我在循环中编写的JSON对象对于多级数组来说要复杂得多。

1 个答案:

答案 0 :(得分:3)

APEX_JSON可以写入临时CLOB,而不是通过网关推送输出,如此处所述。

SET SERVEROUTPUT ON
DECLARE
  l_cursor SYS_REFCURSOR;
BEGIN

  OPEN l_cursor FOR
    SELECT e.empno AS "employee_number",
           e.ename AS "employee_name",
           e.deptno AS "department_number"
    FROM   emp e
    WHERE  rownum <= 2;

  APEX_JSON.initialize_clob_output;

  APEX_JSON.open_object;
  APEX_JSON.write('employees', l_cursor);
  APEX_JSON.close_object;

  DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
  APEX_JSON.free_output;
END;
/

如下所述: https://oracle-base.com/articles/misc/apex_json-package-generate-and-parse-json-documents-in-oracle#temporary-clob

将您的JSON写入CLOB。如果可行,请使用HTP.print将其推送到网关。如果失败,请发送错误消息。

干杯

...添