declare
    l_id rte_images.id%type;
begin
    /*
     * アップロードされた画像は:bodyにバイナリ・データとして保持されている。
     * :content_typeはORDSが設定してくれている。
     * :current_userはAPEXセッションによる保護をかけた場合、APP_USERになる。
     */
    insert into rte_images(content_type, image, created_by, created) 
        values(:content_type, :body, :current_user, sysdate)
        returning id into l_id;
    :status_code := 201;
    /*
     * アップロードに成功した場合は、urlとしてダウンロードするリンクをJSON形式で返す。
     * ex:
     * {
     *    "url": "https://hostname/ords/apexdev/rteditor/image/322343253253"
     *  }
     */
    apex_json.open_object;
    apex_json.write(
        p_name => 'url',
        p_value => owa_util.get_cgi_env('REQUEST_PROTOCOL') ||
        '://' ||
        owa_util.get_cgi_env('SERVER_NAME') ||
        owa_util.get_cgi_env('SCRIPT_NAME') ||
        owa_util.get_cgi_env('PATH_INFO') ||
        '/' || l_id
    );
    apex_json.close_object;
exception
when others then
    /* エラーを返す。
     * {
     *   "error": {
     *       "message": "Something wrong!"
     *   }
     *  }
     */
    apex_json.open_object;
    apex_json.open_object('error');
    apex_json.write('message', 'Something wrong!');
    apex_json.close_object;
    apex_json.close_object;
end;