背景
我需要从Oracle获取几千行,并将它们转换为JSON以便在SlickGrid中使用。目前,我正在用PHP获取行,使用iconv将其从ISO转换为UTF-8,然后使用json_encode将其导出为json。整个操作在DB端大约需要1秒,生成JSON大约需要5秒。这太长了。
question
我读到过Oracle12c支持JSON,但我找不到我真正需要的。
有没有办法以json格式返回标准sql查询的结果?
假设我想发出一个类似以下内容的查询:
SELECT * from table AS JSON
并接收如下所示的有效json:
[{"col1": "value1", "col2": 2}, {"col1": "valueOfRow2", "col2": 3}]
重要的是,我需要对unicode序列进行转义,因为我在客户端使用ISO-8859-2字符集,并且JSON必须采用UTF-8格式或者对序列进行转义。
发布于 2014-11-11 17:30:52
Oracle12c版本12.1.0.2 (截至2014年11月11日的最新版本)添加了JSON支持:https://docs.oracle.com/database/121/NEWFT/chapter12102.htm#BGBGADCC
它从10月17日起就可以使用了。https://blogs.oracle.com/db/entry/oracle_database_12c_release_1
如果您无法修补/使用该版本,有一个由Lewis Cunningham和Jonas Krogsboell编写的优秀包: PL/JSON * http://pljson.sourceforge.net/
这是一个很好的包(我已经在许多数据库安装中使用过它)。
包含的示例很好,涵盖了大多数场景。
declare
ret json;
begin
ret := json_dyn.executeObject('select * from tab');
ret.print;
end;
/
发布于 2017-01-06 05:55:13
12cR2 (在Oracle云中提供)本机支持此功能。
SQL> select JSON_ARRAY(EMPLOYEE_ID, FIRST_NAME,LAST_NAME) from HR.EMPLOYEES;
JSON_ARRAY(EMPLOYEE_ID,FIRST_NAME,LAST_NAME)
--------------------------------------------------------------------------------
[100,"Steven","King"]
[101,"Neena","Kochhar"]
或
SQL> select JSON_OBJECT('ID' is EMPLOYEE_ID , 'FirstName' is FIRST_NAME,'LastName' is LAST_NAME) from HR.EMPLOYEES;
JSON_OBJECT('ID'ISEMPLOYEE_ID,'FIRSTNAME'ISFIRST_NAME,'LASTNAME'ISLAST_NAME)
----------------------------------------------------------------------------
{"ID":100,"FirstName":"Steven","LastName":"King"}
{"ID":101,"FirstName":"Neena","LastName":"Kochhar"}
发布于 2014-11-11 16:40:48
您可以使用xmltype将SQL的结果转换为XML和JSON。有关适用于Oracle版本9及以后版本的解决方案,请参阅以下文章。您还可以下载itstar_xml_util包:
http://stefan-armbruster.com/index.php/12-it/pl-sql/12-oracle-xml-and-json-goodies
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 from 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"
}
]}
https://stackoverflow.com/questions/23560996
复制相似问题