2017-07-20 3 views
0

私はORDSを初めて使用しています。私はAPEX_JSONを使用して、ソース・タイプがPL/SQLのレスト・サービスのjsonオブジェクトを作成しています。 私が作成しているjsonオブジェクトは複雑です。 jsonオブジェクトの作成中に何か問題が発生した場合は、ボディに異なるjson構造を持つエラーを返す必要があります。 エラーのためにボディを作成する前に、私がこの点まで作成したjsonをクリアしたいと思います。 どうすればいいですか?あるいは、これを達成する他の方法がありますか?APEX_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オブジェクトは、複数のレベルの配列ではるかに複雑です。

答えて

2

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

はCLOBにあなたのJSONを書きます。それが動作する場合は、HTP.printを使用してゲートウェイに押し出します。失敗した場合は、エラーメッセージを送信してください。

乾杯

ティム...

+0

どうもありがとうティム、それは働きました。 しかし、このようにして、 'owa_util.mime_header(' application/json ')'を呼び出して、コンテンツタイプ(mimeタイプ)を手動でjsonに設定する必要がありました。デフォルトでは 'text/html'に設定されていました。 これは正しい方法ですか、それとも別の方法ですか? –

+0

それは問題ありません。また、大規模なCLOBを適切に処理することを忘れないでください。それが32Kより大きい場合は、ゲートウェイ上でチャンク内にプッシュする必要があります。 https://oracle-base.com/dba/script?category=miscellaneous&file=string_api.sql –

関連する問題