it-swarm.com.de

Gibt die Ergebnisse einer SQL-Abfrage als JSON in Oracle 12c zurück

Hintergrund

Ich muss einige tausend Zeilen von Oracle abrufen und diese in JSON konvertieren, um sie in SlickGrid verwenden zu können. Momentan rufe ich die Zeilen in PHP ab, konvertiere sie mit iconv von ISO in UTF-8 und exportiere mit json_encode nach json. Die gesamte Operation dauert etwa 1 Sekunde auf DB-Seite und 5 Sekunden, um JSON zu generieren. Es ist zu lang.

Die Frage

Ich habe gelesen, dass Oracle 12c JSON unterstützt, aber ich kann nicht genau das finden, was ich brauche.

Gibt es eine Möglichkeit, das Ergebnis einer Standard-SQL-Abfrage in einem Json-Format zurückzugeben?

angeblich möchte ich eine ähnliche Anfrage stellen:

SELECT * from table AS JSON

und erhalten Sie einen gültigen Json, der diesem ähnlich ist: 

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

Eine wichtige Sache ist, dass ich die Unicode-Sequenzen für mich entgehen lassen muss, da ich auf der Client-Seite den ISO-8859-2-Zeichensatz verwenden und JSON entweder in UTF-8 enthalten sein muss oder die Sequenzen mit Escape-Zeichen versehen sein müssen.

20
SWilk

Oracle 12c Version 12.1.0.2 (neueste Version vom 11.11.2014) fügt JSON-Unterstützung hinzu: https://docs.Oracle.com/database/121/NEWFT/chapter12102.htm#BGBGADCC

Es ist seit dem 17. Oktober verfügbar. https://blogs.Oracle.com/db/entry/Oracle_database_12c_release_1

Wenn Sie mit dieser Version keine Patches ausführen können, gibt es ein hervorragendes Paket, das von Lewis Cunningham und Jonas Krogsboell geschrieben wurde: PL/JSON * http://pljson.sourceforge.net/

Es ist ein ausgezeichnetes Paket (ich habe es in zahlreichen Datenbankinstallationen verwendet).

Die enthaltenen Beispiele sind gut und decken die meisten Szenarien ab. 

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from tab');
  ret.print;
end;
/
15

12cR2 (verfügbar in der Oracle Cloud) unterstützt dies nativ.

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"]

oder 

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"}
6
mark d drake

Sie können den xmltype verwenden, um das Ergebnis einer SQL in XML und JSON zu konvertieren. Im folgenden Artikel finden Sie die Lösung, die seit Version 9 für Oracle funktioniert. Sie können auch das Paket itstar_xml_util herunterladen: 

http://stefan-armbruster.com/index.php/12-it/pl-sql/12-Oracle-xml-and-json-goodies

Ein einfaches Beispiel mit der Emp-Tabelle:

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;

Das Ergebnis sieht so aus:

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

Oracle 12c-Unterstützung für JSON ist eine Fähigkeit, JSON-Objekte zu speichern, sie abzufragen und aus ihnen auszuwählen.

Sie haben ein Tabellenformat und müssen Ihre Daten nur als JSON anzeigen. Sie können also einfach Zeilen zu {'col1': 'rowN1', 'col2': 'rowN2'} verketten und den Rest auf einer Client-Seite machen .. oder Sie können LISTAGG verwenden, um das gesamte Dokument abzurufen. Beispiel: http://technology.amis.nl/2011/06/14/creating-json-document-gerade-von-sql-query-using-listagg-and-with-clause/

Beachten Sie das SQL VARCHAR2-Limit von 4000 Zeichen.

Sie könnten auch in http://database-geek.com/2009/03/25/json-in-und-out-of-Oracle-json-data-type/ nachschlagen. Aber ich denke nicht, Dieser Oracle-Objekttyp verbessert Ihre Leistung.

Ein weiterer Ansatz ist der XML-Export mit XMLType. Dann konvertieren Sie XML in JSON. XMLType kümmert sich um Sonderzeichen und die API ist ziemlich stabil (Sie müssen Ihr Programm nicht für Oracle 14 neu schreiben).

1
vav

Ab Oracle 19c wird die Syntax zum Erstellen einer JSON-Darstellung für eine Tabellenzeile vereinfacht

Zum Beispiel: Um alle Zeilen des hr.employees um jsons zu trennen, benutze

SELECT JSON_OBJECT(*) FROM hr.employees ;

{
"EMPLOYEE_ID" : 100,
"FIRST_NAME" : "Steven",
"LAST_NAME" : "King",
"EMAIL" : "SKING",
"PHONE_NUMBER" : "515.123.4567",
"HIRE_DATE" : "2003-06-17T00:00:00",
"JOB_ID" : "AD_PRES",
"SALARY" : 24000,
"COMMISSION_PCT" : null,
"MANAGER_ID" : null,
"DEPARTMENT_ID" : 90
}                       --row 1
{
"EMPLOYEE_ID" : 101,
"FIRST_NAME" : "Neena",
"LAST_NAME" : "Kochhar",
"EMAIL" : "NKOCHHAR",
"PHONE_NUMBER" : "515.123.4568",
"HIRE_DATE" : "2005-09-21T00:00:00",
"JOB_ID" : "AD_VP",
"SALARY" : 17000,
"COMMISSION_PCT" : null,
"MANAGER_ID" : 100,
"DEPARTMENT_ID" : 90
}                       --row 2
 ...

LIVE SQL-Beispiel

1
Kaushik Nayak

Das Release 12.2 enthält neue Funktionen zum Generieren von JSON-Dokumenten direkt aus SQL-Abfragen. Der einfachste Weg, um das Ziel zu erreichen, ist die Verwendung der Funktionen: JSON_OBJECT und JSON_ARRAYAGG .

create table tab as
    select level col1, 'value '||level col2 from dual connect by level <= 2
/ 

select max (rownum) rn, json_arrayagg (
    json_object (
        key 'col1' value col1,
        key 'col2' value col2
    ) format json returning clob 
) as json_doc
from tab;

Ergebnis:

        RN JSON_DOC                                                                        
---------- ---------------------------------------------------------
         2 [{"col1":1,"col2":"value 1"},{"col1":2,"col2":"value 2"}] 

Test mit großer Datenmenge:

select rn, length (json_doc) json_size, json_doc from (
    <query mentoined above here>
    cross join (select dummy from dual connect by level <= 1e5) 
    );

        RN  JSON_SIZE JSON_DOC                                                                        
---------- ---------- ---------------------------------------------------------
    200000    5600001 [{"col1":1,"col2":"value 1"},{"col1":2,"col2":"value 2"},

Auf der langsamen Testmaschine dauerte es ~ 1 Sek. 5,6M JSON erstellen.


In Release 19c wurde die Syntax der Funktion JSON_OBJECT ist vereinfacht .
Die obige Abfrage sieht jetzt so aus:

select json_arrayagg (  
    json_object (*) returning clob   
) as json_doc  
from tab;

Ein Live SQL .

1
0xdb

Um die Antwort in Oracle 12.2 zu ergänzen, können Sie json nach Belieben erstellen.

SELECT JSON_ARRAY(
JSON_OBJECT (
         KEY 'number' VALUE s.number,
         KEY 'name' VALUE s.sname,
         KEY 'location' VALUE s.loc
          )
       ) AS student_det
FROM   student s;
1
Himanshu sharma

Probieren Sie einfach folgendes aus:

:) Das Leben ist glücklich

with data as
  ( select 
    xmlelement(e,regexp_replace('{"name":"'||colname||'"}', '[[:cntrl:]]', ''),',') col1
    from tblname
  )
  select
        rtrim(replace(replace(replace(xmlagg(col1).getclobval(),'&'||'quot;','"'),'<E>',''),'</E>',''),',')
        as very_long_json
  from data;
0
Shahbaz Ali