Retourner les résultats d'une requête sql comme JSON dans oracle 12c

Background

<!-Je dois récupérer quelques milliers de lignes D'Oracle et les convertir en JSON pour les utiliser dans SlickGrid. Actuellement, je suis en train de récupérer les lignes en PHP, en le convertissant de ISO en UTF-8 avec iconv et en exportant vers json avec json_encode. L'ensemble de l'opération prend environ 1 seconde côté DB et 5 secondes pour générer JSON. C'est la façon de le long.

la question

J'ai lu que Oracle 12c supporte JSON, mais je ne peux pas trouver exactement ce dont j'ai besoin.

Est-il un moyen de retourner le résultat d'une requête sql standard dans un format json?

supposément je voudrais émettre une requête similaire à celle-ci:

SELECT * from table AS JSON

et recevez un json valide similaire à ceci:

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

une chose importante est que j'ai besoin d'avoir les séquences unicode échappées pour moi, comme J'utilise le charset ISO-8859-2 du côté du client, et JSON doivent être dans L'UTF-8 ou avoir les séquences échappées.

18
demandé sur SWilk 2014-05-09 13:24:05

6 réponses

Oracle 12c version 12.1.0.2 (la dernière version au 11.11.2014) ajoute le support JSON: https://docs.oracle.com/database/121/NEWFT/chapter12102.htm#BGBGADCC

Il est disponible depuis le 17 octobre. https://blogs.oracle.com/db/entry/oracle_database_12c_release_1

si vous n'êtes pas capable de patch / travailler avec cette version, il y a un excellent paquet écrit par Lewis Cunningham et Jonas Krogsboell: PL / JSON * http://pljson.sourceforge.net/

c'est un excellent paquet (Je l'ai utilisé dans de nombreuses installations de bases de données).

les exemples inclus sont bons et couvrent la plupart des scénarios.

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from tab');
  ret.print;
end;
/
15
répondu Olafur Tryggvason 2014-11-11 09:30:52

12cR2 (disponible dans le nuage Oracle) supporte cela nativement.

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

ou

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"}
5
répondu mark d drake 2017-01-05 21:55:12

vous pouvez utiliser le xmltype pour convertir le résultat D'un SQL en XML et JSON. Voir l'article suivant pour la solution qui fonctionnera pour Oracle depuis la version 9. Vous pouvez aussi télécharger le paquet itstar_xml_util:

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

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;

Le résultat ressemble à ceci:

{"ROWSET": [
    {
      "EMPNO": 7839,
      "ENAME": "KING",
      "JOB": "PRESIDENT"
    },
    {
      "EMPNO": 7698,
      "ENAME": "BLAKE",
      "JOB": "MANAGER"
    },
[...]
    {
      "EMPNO": 7934,
      "ENAME": "MILLER",
      "JOB": "CLERK"
    }
  ]}
4
répondu PT_STAR 2014-11-11 09:35:01

Oracle 12c le support de JSON est une capacité à stocker des objets JSON, à les interroger et à les sélectionner.

vous avez un format tabulaire et n'avez besoin que d'afficher vos données comme JSON. Vous pouvez donc simplement concaténer les lignes en {'col1':' rowN1',' col2':' rowN2'} et faire le reste du côté client. Ou vous pouvez utiliser LISTAGG pour obtenir le document entier. Exemple: http://technology.amis.nl/2011/06/14/creating-json-document-straight-from-sql-query-using-listagg-and-with-clause/

il suffit de faire attention à la limite SQL VARCHAR2 de 4000 caractères.

Vous pouvez aussi regarder dans http://database-geek.com/2009/03/25/json-in-and-out-of-oracle-json-data-type/ Mais je ne pense pas que l'oracle type d'objet vous permettra d'améliorer votre performance.

une autre approche consiste à exporter XML en utilisant XMLType. Puis convertir XML en JSON. XMLType s'occupera des caractères spéciaux, et L'API est assez stable (vous n'aurez pas besoin de réécrire votre programme pour Oracle 14).

1
répondu vav 2014-05-09 14:45:32

pour ajouter à la réponse dans oracle 12.2, vous pouvez créer json comme vous le voulez .

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;
0
répondu Himanshu sharma 2017-11-03 14:12:11

Je ne vois pas de solution Python (dans le cas où vous devez vider JSON).

j'ai écrit json-ora-extrait de pour les extraits de taille moyenne (car l'ensemble de données doit correspondre à la mémoire disponible).

wx_Oracle et json modules Python pour lire les données de la base de données Oracle (n'importe quelle version) et les transférer dans *.json fichier.

il y a aussi une option pour créer compressé *.gz fichier.

-1
répondu olekb 2017-09-11 20:30:55