【问题标题】:Generating JSON with multiple functions using Oracle APEX_JSON使用 Oracle APEX_JSON 生成具有多个函数的 JSON
【发布时间】:2022-01-24 12:55:26
【问题描述】:

目前,我正在使用 oracle 为后端目的生成一些带有数据的 json,并且我正在努力处理必须手动处理的复杂且重复的结构。

例如我有这个对象数组:

{
  "infoColumnsWidgets": [
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 1,
      "navigateToPage": null,
      "widgetData": {
        "title": "Fact",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "200000"
          }
        ]
      }
    },
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 2,
      "navigateToPage": null,
      "widgetData": {
        "title": "Plan",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "200000"
          }
        ]
      }
    },
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 3,
      "navigateToPage": null,
      "widgetData": {
        "title": "Prognosis",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "100"
          }
        ]
      }
    }
  ]
}

当然,我在循环中生成它,但这种结构经常出现,我更愿意将它放入某个函数中以执行以下操作:

function f_getTest return clob as
  v_res clob;
begin
  apex_json.initialize_clob_output;
  apex_json.open_object;
    apex_json.open_object('infoColumnsWidgets');
    for rec in (select * from some_table_data)
    loop
      apex_json.write_raw(f_getWidgetJson(rec.param));
    end loop;
    apex_json.close_object;
  apex_json.close_all;
  v_res := apex_json.get_clob_output;
  apex_json.free_output;
  return v_res;
end;

但据我所知,没有选项可以使用 apex_json 将一个 json 放入另一个中。我可以尝试一些奇怪的解决方法,在最终的 clob 中放置一些占位符并替换它们,但不,我不想,请不要让我这样做。

非常欢迎任何想法

【问题讨论】:

  • 你使用的是什么版本的oracle?目前还不清楚您到底想做什么 - 您是想从关系表生成 json 还是存储了需要修改的 json?
  • Oracle 12c,apex - 5,据我所知。我使用 apex_json 函数成功生成了上面展示的 json:打开数组、添加对象、放置一些值、关闭对象和数组,你知道的。我想做的就是把重复的部分变成函数;在生成时在循环中调用它们。
  • 我已经创建了一个单独的函数来生成一个我想放入“main”json函数的对象,但是我没有找到任何方法将它正确地添加到结构中。
  • 从 12c 第 2 版开始,您可以在数据库中原生使用 sql 生成 json - 这比使用 apex_json 容易得多
  • 或者,您也可以只编写 sql 语句并使用 ORDS 将它们公开为 json(作为一项安静的服务) - 您只需要检查您的 ords 版本中的可能性

标签: json oracle plsql apex


【解决方案1】:

这有帮助吗?我从oracle-base 中获取了示例,并将正文代码移到了一个单独的过程中。在下面的示例中,它是一个内联过程,但没有什么能阻止您将其放入独立过程或包中。

DECLARE
  PROCEDURE dept_object 
  IS
    l_cursor SYS_REFCURSOR;
  BEGIN
    OPEN l_cursor FOR
      SELECT d.dname AS "department_name",
             d.deptno AS "department_number",
             CURSOR(SELECT e.empno AS "employee_number",
                           e.ename AS "employee_name"
                    FROM   emp e
                    WHERE  e.deptno = d.deptno
                    ORDER BY e.empno) AS "employees"
      FROM   dept d
      ORDER BY d.dname;
    APEX_JSON.open_object;
    APEX_JSON.write('departments', l_cursor);   
    APEX_JSON.close_object;         
  END;
BEGIN
  APEX_JSON.initialize_clob_output;  
  dept_object;
  DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
  APEX_JSON.free_output;
END;
/

【讨论】:

  • 非常感谢,这有帮助。我的错误是在内部函数中初始化第二个 clob 输出。
  • 很高兴听到它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多