Dans Oracle Database, le JSON_QUERY() La fonction sélectionne et renvoie une ou plusieurs valeurs à partir des données JSON et renvoie ces valeurs.
Vous pouvez utiliser la fonction pour récupérer des fragments d'un document JSON.
Syntaxe
La syntaxe ressemble à ceci :
JSON_QUERY
( expr [ FORMAT JSON ], JSON_basic_path_expression
[ JSON_query_returning_clause ] [ JSON_query_wrapper_clause ]
[ JSON_query_on_error_clause ] [ JSON_query_on_empty_clause ]
) Où :
exprest le document JSON que vous souhaitez interrogerJSON_basic_path_expressionest le chemin SQL/JSON que vous souhaitez renvoyer à partir de ce document JSON. La fonction utilise l'expression de chemin pour évaluerexpret recherchez une ou plusieurs valeurs JSON qui correspondent ou satisfont à l'expression de chemin. L'expression de chemin doit être un littéral de texte.JSON_query_returning_clausespécifie le type de données et le format de la chaîne de caractères renvoyée par la fonction.JSON_query_wrapper_clausecontrôle si la fonction enveloppe les valeurs renvoyées dans un wrapper de tableau (crochets ([])).JSON_query_on_error_clausespécifie la valeur renvoyée lorsque certaines erreurs se produisent.JSON_query_on_empty_clausespécifie la valeur renvoyée si aucune correspondance n'est trouvée lorsque les données JSON sont évaluées à l'aide de l'expression de chemin SQL/JSON.
Voir la documentation Oracle pour une explication détaillée des clauses facultatives.
Exemple
Voici un exemple pour montrer comment le JSON_QUERY() la fonction fonctionne :
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$')
FROM DUAL; Résultat :
{"a":1,"b":2,"c":3} L'utilisation du signe dollar seul renvoie la chaîne entière de données JSON.
Avec emballage
Vous pouvez utiliser le WITH WRAPPER clause pour envelopper le résultat dans un wrapper de tableau :
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH WRAPPER)
FROM DUAL; Résultat :
[{"a":1,"b":2,"c":3}] Vous devez spécifier cette clause si l'expression de chemin correspond à une seule valeur scalaire (une valeur qui n'est pas un objet JSON ou un tableau JSON) ou à plusieurs valeurs de n'importe quel type.
Par exemple, retourner la valeur scalaire suivante doit être fait avec le WITH WRAPPER clause :
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH WRAPPER)
FROM DUAL; Résultat :
[2]
Omettre le WITH WRAPPER clause lors du renvoi d'une valeur scalaire entraîne le renvoi d'une valeur nulle :
SET NULL 'null';
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b')
FROM DUAL; Résultat :
null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois que null se produit à la suite d'un SQL SELECT déclaration.
Cependant, vous pouvez utiliser SET NULL pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null doit être retourné.
Avec wrapper conditionnel
Alternativement, vous pouvez utiliser le WITH CONDITIONAL WRAPPER clause pour inclure le wrapper de tableau uniquement si l'expression de chemin correspond à une seule valeur scalaire ou à plusieurs valeurs de n'importe quel type. Si l'expression de chemin correspond à un seul objet JSON ou tableau JSON, le wrapper de tableau est omis :
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH CONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH CONDITIONAL WRAPPER) AS "r2"
FROM DUAL; Résultat :
r1 r2
______________________ ______
{"a":1,"b":2,"c":3} [2] Dans ce cas, seule la valeur scalaire a le wrapper de tableau appliqué.
Juste pour être clair, le voici avec un wrapper inconditionnel :
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH UNCONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH UNCONDITIONAL WRAPPER) AS "r2"
FROM DUAL; Résultat :
r1 r2
________________________ ______
[{"a":1,"b":2,"c":3}] [2] Cette fois, le wrapper est appliqué aux deux résultats.
Notez que WITH UNCONDITIONAL WRAPPER est l'équivalent de WITH WRAPPER .
Gestion des erreurs
Il existe cinq clauses que vous pouvez utiliser pour spécifier ce qu'il faut renvoyer chaque fois que certains types d'erreurs se produisent. Les clauses sont :
NULLONERROR– Renvoie null lorsqu'une erreur se produit. C'est la valeur par défaut.ERRORONERROR– Renvoie l'erreur Oracle appropriée lorsqu'une erreur se produit.EMPTYONERROR– Spécifier cette clause équivaut à spécifierEMPTYARRAYONERROR.EMPTYARRAYONERROR– Retourne un tableau JSON vide ([]) lorsqu'une erreur se produit.EMPTYOBJECTONERROR– Renvoie un objet JSON vide ({}) lorsqu'une erreur se produit.
Voici un exemple :
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' NULL ON ERROR) AS "r1",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON ERROR) AS "r2",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY OBJECT ON ERROR) AS "r3"
FROM DUAL; Résultat :
r1 r2 r3
_______ _____ _____
null [] {}
Le voici avec le ERROR ON ERROR clause :
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' ERROR ON ERROR)
FROM DUAL; Résultat :
Error report - ORA-40462: JSON_VALUE evaluated to no value
Ces clauses d'erreur permettent de gérer les erreurs suivantes :
- Le premier argument n'est pas une donnée JSON bien formée utilisant une syntaxe JSON stricte ou laxiste
- Aucune correspondance n'est trouvée lorsque les données JSON sont évaluées à l'aide de l'expression de chemin SQL/JSON. Vous pouvez remplacer le comportement de ce type d'erreur en spécifiant la
JSON_query_on_empty_clause. - Le type de données de la valeur de retour n'est pas assez grand pour contenir la chaîne de caractères de retour
- La fonction correspond à une seule valeur scalaire ou à plusieurs valeurs de n'importe quel type, et aucune clause wrapper n'est spécifiée
Gestion des résultats vides
Vous pouvez également utiliser une clause pour spécifier la valeur renvoyée si aucune correspondance n'est trouvée. Cette clause vous permet de spécifier un résultat différent pour ce type d'erreur que le résultat spécifié avec les clauses d'erreur.
Ces clauses sont :
NULLONEMPTY– Renvoie null lorsqu'aucune correspondance n'est trouvée.ERRORONEMPTY– Renvoie l'erreur Oracle appropriée lorsqu'aucune correspondance n'est trouvée.EMPTYONEMPTY– Spécifier cette clause équivaut à spécifierEMPTYARRAYONEMPTY.EMPTYARRAYONEMPTY– Retourne un tableau JSON vide ([]) lorsqu'aucune correspondance n'est trouvée.EMPTYOBJECTONEMPTY– Renvoie un objet JSON vide ({}) lorsqu'aucune correspondance n'est trouvée.
Exemple :
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON EMPTY)
FROM DUAL; Résultat :
[]
Si vous omettez cette clause, la clause d'erreur détermine la valeur renvoyée lorsqu'aucune correspondance n'est trouvée.