【问题标题】:How to clear the json object written by APEX_JSON如何清除APEX_JSON写的json对象
【发布时间】:2017-12-25 20:50:10
【问题描述】:

我是 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 对象对于多级数组来说要复杂得多。

【问题讨论】:

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


    【解决方案1】:

    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 将其推送到网关。如果失败,请发送您的错误消息。

    干杯

    提姆...

    【讨论】:

    • 非常感谢蒂姆,它成功了。但是通过这种方式,我必须通过调用'owa_util.mime_header('application/json')'手动将内容类型(mime 类型)设置为 json。默认情况下,它设置为“文本/html”。这是正确的方法还是有其他方法?
    • 没关系。还要记住正确处理大型 CLOB。如果它大于 32K,您可能需要将它分块地推到网关上。 oracle-base.com/dba/…
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2018-10-15
    • 2013-07-12
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多