如何在oracle 12c中以JSON形式返回SQL查询的结果?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (305)

背景

我需要从Oracle获取数千行,并将它们转换为JSON,以便在SlickGrid中使用。目前,我正在获取PHP中的行,用iconv将它从iso转换为utf-8,并用json导出到json。_编码。整个操作在DB端大约需要1秒,生成JSON需要5秒。

问题

我读过Oracle 12c支持JSON,但我无法找到我需要的确切内容。

是否有一种方法以json格式返回标准SQL查询的结果?

据推测,我想发布一个类似于以下内容的查询:

SELECT * from table AS JSON

并接收与以下类似的有效JSON:

[{"col1": "value1", "col2": 2}, {"col1": "valueOfRow2", "col2": 3}]

一个重要的事情是,我需要让Unicode序列转义,因为我在客户端使用了ISO-8859-2字符集,而JSON必须在UTF-8中或者在转义序列中。

提问于
用户回答回答于

Oracle 12c版本12.1.0.2(截至11.11.2014的最新版本)添加了JSON支持:

https://docs.oracle.com/database/121/NEWFT/chapter12102.htm#BGBGADCC

包括的例子很好,涵盖了大多数场景。

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from tab');
  ret.print;
end;
/
用户回答回答于

您可以使用xmltype将SQL的结果转换为XML和JSON。

一个简单的EMP表示例:

declare
  l_sql_string varchar2(2000);
  l_xml        xmltype;
  l_json       xmltype;
begin
  l_sql_string := 'select a.empno, a.ename, a.job from emp a';

  -- Create the XML aus SQL
  l_xml := itstar_xml_util.sql2xml(l_sql_string);

  -- Display the XML
  dbms_output.put_line(l_xml.getclobval());

  l_json := itstar_xml_util.xml2json(l_xml);
  -- Display the JSON
  dbms_output.put_line(l_json.getclobval());  
end;

结果如下:

{"ROWSET": [
    {
      "EMPNO": 7839,
      "ENAME": "KING",
      "JOB": "PRESIDENT"
    },
    {
      "EMPNO": 7698,
      "ENAME": "BLAKE",
      "JOB": "MANAGER"
    },
[...]
    {
      "EMPNO": 7934,
      "ENAME": "MILLER",
      "JOB": "CLERK"
    }
  ]}

扫码关注云+社区

领取腾讯云代金券