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.
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;
/
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"}
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"
}
]}
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).
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;
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.