PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.14 » Langage SQL » Fonctions et opérateurs » Fonctions XML

9.15. Fonctions XML

Les fonctions et les expressions dĂ©crites dans cette section opĂšrent sur des valeurs de type xml. Voir Section 8.13 pour des informations sur le type xml. Les expressions xmlparse et xmlserialize pour convertir vers ou Ă  partir d'un type xml sont documentĂ©es ici, et non pas dans cette section.

L'utilisation de la plupart de ces fonctions requiert que PostgreSQL soit construit avec configure --with-libxml.

9.15.1. Produire du contenu XML

Un ensemble de fonctions et d'expressions est disponible pour produire du contenu XML Ă  partir de donnĂ©es SQL. Elles sont donc tout particuliĂšrement intĂ©ressantes pour formater le rĂ©sultat de requĂȘtes en des documents XML pour un traitement dans des applications clientes.

9.15.1.1. xmlcomment

xmlcomment ( text ) → xml
   

La fonction xmlcomment crĂ©e une valeur XML contenant un commentaire XML avec le texte spĂ©cifiĂ© comme contenu. Le texte ne peut pas contenir « -- Â» ou se terminer avec un « - Â», sinon la construction rĂ©sultante serait un commentaire XML invalide. Si l'argument est NULL, le rĂ©sultat est NULL.

Example:

SELECT xmlcomment('hello');

  xmlcomment
--------------
 <!--hello-->
    

9.15.1.2. xmlconcat

xmlconcat ( xml [, ...] ) → xml
  

La fonction xmlconcat concatÚne une liste de valeurs XML individuelles pour créer une seule valeur contenant un fragment de contenu XML. Les valeurs NULL sont omises. Le résultat est NULL si tous les arguments sont NULL.

Example:

SELECT xmlconcat('<abc/>', '<bar>foo</bar>');

      xmlconcat
----------------------
 <abc/><bar>foo</bar>

Les dĂ©clarations XML sont combinĂ©es ainsi. Si toutes les valeurs des arguments ont la mĂȘme dĂ©claration de version XML, cette version est utilisĂ©e comme rĂ©sultat. Sinon, aucune version n'est utilisĂ©e. Si toutes les valeurs des arguments ont une valeur de dĂ©clarationl standalone Ă  « yes Â», alors cette valeur est utilisĂ©e dans le rĂ©sultat. Si toutes les valeurs d'agument ont une valeur de dĂ©claration standalone et qu'au moins une de ces valeurs est « no Â», alors cette valeur est utilisĂ©e dans le rĂ©sultat. Dans tous les autres cas, le rĂ©sultat n'aura pas de dĂ©claration standalone. Si le rĂ©sultat nĂ©cessite une dĂ©claration standalone, mais par de dĂ©claration version, une dĂ©claration version 1.0 sera utilisĂ©e car XML requiert qu'une dĂ©claration XML contiennent une dĂ©claration de version. Les dĂ©clarations d'encodage sont ignorĂ©s et supprimĂ©s dans tous les cas.

Example:

SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');

             xmlconcat
-----------------------------------
 <?xml version="1.1"?><foo/><bar/>

9.15.1.3. xmlelement

xmlelement ( NAME name [, XMLATTRIBUTES ( attvalue [ AS attname ] [, ...] ) ] [, content [, ...]] ) → xml
   

L'expression xmlelement produit un Ă©lĂ©ment XML avec le nom, les attributs et le contenu donnĂ©s. Les Ă©lĂ©ments name et attname affichĂ©s dans la syntaxe sont de simples identifiants, et non pas des valeurs. Les Ă©lĂ©ments attvalue et content sont des expressions, qui peuvent ĂȘtre de n'importe quel type de donnĂ©es PostgreSQL. Les arguments dans XMLATTRIBUTES gĂ©nĂšrent les attributs de l'Ă©lĂ©ment XML ; les valeurs content sont concatĂ©nĂ©es pour former son contenu.

Examples:

SELECT xmlelement(name foo);

 xmlelement
------------
 <foo/>

SELECT xmlelement(name foo, xmlattributes('xyz' as bar));

    xmlelement
------------------
 <foo bar="xyz"/>

SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');

             xmlelement
-------------------------------------
 <foo bar="2007-01-26">content</foo>

Les noms d'Ă©lĂ©ments et d'attributs qui ne sont pas des noms XML valides sont Ă©chappĂ©s en remplaçant les caractĂšres problĂ©matiques par la sĂ©quence _xHHHH_, oĂč HHHH est le point code Unicode du caractĂšre dans sa notation hexadĂ©cimale. Par exemple :

SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));

            xmlelement
----------------------------------
 <foo_x0024_bar a_x0026_b="xyz"/>

Un nom d'attribut explicite n'a pas besoin d'ĂȘtre spĂ©cifiĂ© si la valeur de l'attribut est une rĂ©fĂ©rence de colonne, auquel cas le nom de la colonne sera utilisĂ© comme nom d'attribut par dĂ©faut. Dans les autres cas, l'attribut doit se voir donner un nom explicite. Donc cet exemple est valide :

CREATE TABLE test (a xml, b xml);
SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;
    

Mais ces exemples ne le sont pas :

SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;
    

Le contenu d'un Ă©lĂ©ment, si indiquĂ©, sera formatĂ© suivant ton type de donnĂ©es. Si le contenu est lui-mĂȘme de type xml, des documents XML complexes peuvent ĂȘtre construits. Par exemple :

SELECT xmlelement(name foo, xmlattributes('xyz' as bar),
                            xmlelement(name abc),
                            xmlcomment('test'),
                            xmlelement(name xyz));

                  xmlelement
----------------------------------------------
 <foo bar="xyz"><abc/><!--test--><xyz/></foo>
   

Le contenu des autres types sera formatĂ© en une donnĂ©e caractĂšre XML valide. Ceci signifie en particulier que les caractĂšres <, >, et & seront convertis en entitĂ©s. Les donnĂ©es binaires (type de donnĂ©es bytea) seront reprĂ©sentĂ©es dans un encodage base64 ou hex, suivant la configuration du paramĂštre xmlbinary. Le comportement particulier pour les types de donnĂ©es individuels devrait Ă©voluer pour aligner les correspondances PostgreSQL avec ceux spĂ©cifiĂ©s dans SQL:2006 et ultĂ©rieurs, comme discutĂ© dans Section D.3.1.3.

9.15.1.4. xmlforest

xmlforest ( content [ AS name ] [, ...] ) → xml
 

L'expression xmlforest produit une forĂȘt (sĂ©quence) XML d'Ă©lĂ©ments en utilisant les noms et le contenu donnĂ©s. Quant Ă  xmlelement, chaque name doit ĂȘtre un simple identifiant, alors que les expressions content peuvent avoir n'importe quel type de donnĂ©es.

Exemples :

SELECT xmlforest('abc' AS foo, 123 AS bar);

          xmlforest
------------------------------
 <foo>abc</foo><bar>123</bar>


SELECT xmlforest(table_name, column_name)
FROM information_schema.columns
WHERE table_schema = 'pg_catalog';

                                xmlforest
------------------------------------​-----------------------------------
 <table_name>pg_authid</table_name>​<column_name>rolname</column_name>
 <table_name>pg_authid</table_name>​<column_name>rolsuper</column_name>
 ...
  

Comme indiquĂ© dans le deuxiĂšme exemple, le nom de l'Ă©lĂ©ment peut ĂȘtre omis si la valeur contenue est une rĂ©fĂ©rence de colonne, auquel cas le nom de l'Ă©lĂ©ment est utilisĂ© par dĂ©faut. Sinon un nom doit ĂȘtre spĂ©cifiĂ©.

Les noms d'élément qui ne sont pas des noms XML valides sont échappés comme indiqué pour xmlelement ci-dessus. De façon similaire, les données du contenu sont échappées pour rendre le contenu XML valide, sauf s'il est déjà de type xml.

Notez que les forĂȘts XML ne sont pas des documents XML valides si elles consistent de plus d'un Ă©lĂ©ment, donc il pourrait ĂȘtre utile d'envelopper les expressions xmlforest dans xmlelement.

9.15.1.5. xmlpi

xmlpi ( NAME name [, content ] ) → xml
 

L'instruction xmlpi crĂ©e une instruction de traitement XML. Quant Ă  xmlelement, name doit ĂȘtre un simple identifiant, alors que l'expression content peut contenir tout type de donnĂ©es. Si prĂ©sent, content ne doit pas contenir la sĂ©quence de caractĂšres ?>.

Exemple :

SELECT xmlpi(name php, 'echo "hello world";');

            xmlpi
-----------------------------
 <?php echo "hello world";?>

9.15.1.6. xmlroot

xmlroot ( xml, VERSION {text|NO VALUE} [, STANDALONE {YES|NO|NO VALUE} ] ) → xml
  

L'expression xmlroot altĂšre les propriĂ©tĂ©s du nƓud racine d'une valeur XML. Si une version est spĂ©cifiĂ©e, elle remplace la valeur dans la dĂ©claration de version du nƓud racine ; si un paramĂštre standalone est spĂ©cifiĂ©, il remplace la valeur dans la dĂ©claration standalone du nƓud racine.

SELECT xmlroot(xmlparse(document '<?xml version="1.1"?><content>abc</content>'),
               version '1.0', standalone yes);

                xmlroot
----------------------------------------
 <?xml version="1.0" standalone="yes"?>
 <content>abc</content>

9.15.1.7. xmlagg

xmlagg ( xml ) → xml
   

La fonction xmlagg est, contrairement aux autres fonctions dĂ©crites ici, une fonction d'agrĂ©gat. Elle concatĂšne les valeurs en entrĂ©e Ă  l'appel de fonction d'agrĂ©gat, tout comme le fait xmlconcat, sauf que la concatĂ©nation survient au travers des lignes plutĂŽt qu'au travers des expressions dans une seule ligne. Voir Section 9.21 pour l'information supplĂ©mentaire sur les fonctions d'agrĂ©gat.

Exemple :

CREATE TABLE test (y int, x xml);
INSERT INTO test VALUES (1, '<foo>abc</foo>');
INSERT INTO test VALUES (2, '<bar/>');
SELECT xmlagg(x) FROM test;
        xmlagg
----------------------
 <foo>abc</foo><bar/>

Pour dĂ©terminer l'ordre de la concatĂ©nation, une clause ORDER BY peut ĂȘtre ajoutĂ© Ă  l'appel de l'agrĂ©gat comme dĂ©crit dans Section 4.2.7. Par exemple :

SELECT xmlagg(x ORDER BY y DESC) FROM test;
        xmlagg
----------------------
 <bar/><foo>abc</foo>

L'approche non standard suivante Ă©tait recommendĂ©e dans les versions prĂ©cĂ©dentes et pourrait toujours ĂȘtre utile dans des cas spĂ©cifiques :

SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;
        xmlagg
----------------------
 <bar/><foo>abc</foo>

9.15.2. PrĂ©dicats XML

Les expressions décrites dans cette section vérifient les propriétés des valeurs xml.

9.15.2.1. IS DOCUMENT

xml IS DOCUMENT → boolean
    

L'expression IS DOCUMENT renvoie true si la valeur de l'argument XML est un document XML propre, false si elle ne l'est pas (c'est-Ă -dire un fragment de contenu), ou null si l'argument est null. Voir Section 8.13 sur la diffĂ©rence entre les documents et les fragments de contenu.

9.15.2.2. IS NOT DOCUMENT

xml IS NOT DOCUMENT → boolean
    

L'expression IS NOT DOCUMENT renvoie false si la valeur de l'argument XML est un document XML propre, true si elle ne l'est pas (c'est-Ă -dire un fragment de contenu), ou null si l'argument est null.

9.15.2.3. XMLEXISTS

XMLEXISTS ( text PASSING [BY {REF|VALUE}] xml [BY {REF|VALUE}] ) → boolean
    

La fonction xmlexists Ă©value une expression XPath 1.0 (le premier argument), avec la valeur XML passĂ©e comme son Ă©lĂ©ment de contexte. La fonction renvoie false si le rĂ©sultat de cette Ă©valuation renvoie un ensemble de nƓud vide, true si elle renvoie toute autre valeur. La fonction renvoie null si un argument vaut null. Une valeur non null passĂ©e comme Ă©lĂ©ment de contexte doit ĂȘtre un document XML, et non pas un fragment de contenu ou une valeur non XML.

Example:

SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY VALUE '<towns><town>Toronto</town><town>Ottawa</town></towns>');

 xmlexists
------------
 t
(1 row)

Les clauses BY REF et BY VALUE sont acceptĂ©es dans PostgreSQL, mais sont ignorĂ©es comme indiquĂ© dans Section D.3.2.

Dans le standard SQL, la fonction xmlexists Ă©value une expression dans le langage XML Query, mais PostgreSQL autorise seulement une expression XPath 1.0, comme discutĂ© dans Section D.3.1.

9.15.2.4. xml_is_well_formed

xml_is_well_formed ( text ) → boolean
xml_is_well_formed_document ( text ) → boolean
xml_is_well_formed_content ( text ) → boolean
     

Ces fonctions vérifient si une chaßne de type text représente un XML bien formé, renvoyant un résultat booléen. xml_is_well_formed_document vérifie si le document est bien formé alors que xml_is_well_formed_content vérifie que c'est une contenu bien formé. xml_is_well_formed fait le premier si le paramÚtre de configuration xmloption est configuré à DOCUMENT, et le deuxiÚme s'il est configuré à CONTENT. Ceci signifie que xml_is_well_formed est utile pour voir si une simple conversion vers le type xml réussira, alors que les deux autres fonctions sont utiles pour voir si les variantes correspondantes de XMLPARSE réussira.

Exemples :

SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('<>');
 xml_is_well_formed
--------------------
 f
(1 row)

SELECT xml_is_well_formed('<abc/>');
 xml_is_well_formed
--------------------
 t
(1 row)

SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
 xml_is_well_formed
--------------------
 t
(1 row)

SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
 xml_is_well_formed_document
-----------------------------
 t
(1 row)

SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
 xml_is_well_formed_document
-----------------------------
 f
(1 row)

Le dernier exemple montre que les vérifications incluent une vérification de correspondance sur les espaces de nom.

9.15.3. Traiter du XML

Pour traiter les valeurs de type xml, PostgreSQL offre les fonctions xpath et xpath_exists, qui évaluent les expressions XPath 1.0 et la fonction de table XMLTABLE.

9.15.3.1. xpath

xpath ( xpath text, xml xml [, nsarray text[] ] ) → xml[]
      

La fonction xpath Ă©value l'expression XPath 1.0 indiquĂ©e dans xpath (sous la forme d'une donnĂ©e de type text) avec la valeur XML de type xml. Elle renvoie des valeurs XML correspondant Ă  l'ensemble de nƓuds produits par l'expression XPath. Si l'expression XPath renvoie une valeur scalaire plutĂŽt qu'un ensemble de nƓuds, un tableau d'un seul Ă©lĂ©ment est renvoyĂ©.

Le deuxiĂšme argument doit ĂȘtre un document XML bien formĂ©. En particulier, il doit avoir un seul Ă©lĂ©ment de nƓud racine.

Le troisiĂšme argument optionnel de la fonction est un tableau de correspondances d'espaces de nom. Ce tableau devrait ĂȘtre un tableau de text Ă  deux dimensions avec la longueur du deuxiĂšme axe Ă©gale Ă  2 (cela devrait ĂȘtre un tableau de tableaux, chacun des deux contenant exactement deux Ă©lĂ©ments). Le premier Ă©lĂ©ment de chaque entrĂ©e de tableau est le nom de l'espace de noms (alias), le second est l'URI de l'espace de noms. Il n'est pas requis que les alias fournis dans ce tableau soient identiques Ă  ceux utilisĂ©s dans le document XML lui-mĂȘme (en d'autres termes, dans le document XML et dans le contexte de la fonction xpath function context, les alias sont local).

Exemple :

SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
             ARRAY[ARRAY['my', 'http://example.com']]);

 xpath
--------
 {test}
(1 row)

Pour gĂ©rer les espaces de noms par dĂ©faut (anonymes), faire ceci :

SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a>',
             ARRAY[ARRAY['mydefns', 'http://example.com']]);

 xpath
--------
 {test}
(1 row)

9.15.3.2. xpath_exists

xpath_exists ( xpath text, xml xml [, nsarray text[] ] ) → boolean
       

La fonction xpath_exists est une forme spĂ©cialisĂ©e de la fonction xpath. Au lieu de renvoyer les valeurs XML individuelles satisfaisant l'expression XPath 1.0, cette fonction renvoie un boolĂ©en indiquant si la requĂȘte Ă©tait satisfaite ou non (spĂ©cifiquement s'il produit une valeur autre qu'un ensemble vide de nƓuds). Cette fonction est Ă©quivalente au prĂ©dicat XMLEXISTS, sauf qu'il offre aussi du support pour l'argument de correspondance d'espaces de noms.

Example:

SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
                     ARRAY[ARRAY['my', 'http://example.com']]);

 xpath_exists
--------------
 t
(1 row)

9.15.3.3. xmltable

XMLTABLE (
    [ XMLNAMESPACES ( namespace_uri AS namespace_name [, ...] ), ]
    row_expression PASSING [BY {REF|VALUE}] document_expression [BY {REF|VALUE}]
    COLUMNS name { type [PATH column_expression] [DEFAULT default_expression] [NOT NULL | NULL]
                  | FOR ORDINALITY }
            [, ...]
) → setof record
        

L'expression xmltable produit une table basĂ©e sur une valeur XML, un filtre XPath pour extraire les lignes et un ensemble de dĂ©finition de colonnes. Bien que cela ressemble syntaxiquement Ă  une fonction, il peut aussi apparaĂźtre comme une table dans la clause FROM de la requĂȘte.

La clause XMLNAMESPACES optionnelle donne une liste, sĂ©parĂ©e par des virgules, des dĂ©finitions d'espaces de nom, oĂč chaque namespace_uri est une expression text et chaque namespace_name est un simple identifiant. Elle spĂ©cifie les espaces de nom XML utilisĂ©s dans le document et leur alias. La spĂ©cification d'un espace de nom par dĂ©faut n'est actuellement pas supportĂ©e.

L'argument requis row_expression est une expression XPath 1.0 (donnĂ© sous la forme d'un text) qui est Ă©valuĂ©e, passant la valeur XML document_expression sous la forme d'un Ă©lĂ©ment de contexte, pour obtenir un ensemble de nƓuds XML. Ces nƓuds sont ce que xmltable transforme des lignes en sortie. Aucune ligne ne sera produite si document_expression est NULL, ou si row_expression produit un ensemble vide de nƓuds ou tout autre valeur qu'un ensemble de nƓuds.

document_expression fournit l'Ă©lĂ©ment de contexte pour row_expression. Cela doit ĂȘtre un document XML bien formĂ© ; les fragments/forĂȘts ne sont pas acceptĂ©s. Les clauses BY REF et BY VALUE sont acceptĂ©es mais ignorĂ©es, comme discutĂ© dans Section D.3.2.

Dans le standard SQL, la fonction xmltable Ă©value des expressions dans le langage XML Query, mais PostgreSQL autorise seulement les expressions XPath 1.0, comme discutĂ©es dans Section D.3.1.

La clause requise COLUMNS spécifie les colonnes produites dans la table en sortie. Voir le résumé de la syntaxe ci-dessus pour le format. Un nom est requis pour chaque colonne, comme l'est un type de données (sauf si FOR ORDINALITY est spécifié, auquel cas le type integer est implicite). Les clauses de chemin, de valeur par défaut et de nullabilité sont optionnelles.

Une colonne marquĂ©e FOR ORDINALITY sera peuplĂ©e avec les numĂ©ros de lignes, commençant par 1, dans l'ordre des nƓuds rĂ©cupĂ©rĂ©s Ă  partir de l'ensemble de nƓuds rĂ©sultats de row_expression. Au plus une colonne sera marquĂ©e FOR ORDINALITY.

Note

XPath 1.0 ne spĂ©cifie pas d'ordre pour les nƓuds dans un ensemble de nƓuds, donc le code qui relie un ordre particulier de rĂ©sultats sera dĂ©pendant de l'implĂ©mentation. Les dĂ©tails sont disponibles dans Section D.3.1.2.

Le column_expression pour un colonne est une expression XPath 1.0 qui est Ă©valuĂ©e pour chaque ligne, avec le nƓud courant provenant du rĂ©sultat de row_expression comme son Ă©lĂ©ment de contexte, pour trouver la valeur de la colonne. Si aucune column_expression n'est donnĂ©e, alors le nom de la colonne est utilisĂ© comme un chemin implicite.

Si une expression XPath de colonne renvoie une valeur non XML (qui est limitée à une chaßne, un booléen ou un double en XPath 1.0) et la colonne a un type type autre que xml, la colonne sera configurée ainsi en affectant la représentation textuelle de la valeur vers le type PostgreSQL. (Si la valeur est un booléen, sa représentation textuelle est comprise comme 1 ou 0 si la catégorie du type de la colonne en sortie est numérique, sinon true ou false.)

Si l'expression XPath d'une colonne renvoie un ensemble non vide de nƓuds XML et si le type PostgreSQL de la colonne est xml, la colonne sera affectĂ©e au rĂ©sultat exact de l'expression s'il est de forme document ou contenu. [8]

Un rĂ©sultat non XML affectĂ© Ă  une colonne xml en sortie produit du contenu, un nƓud texte simple avec la valeur chaĂźne du rĂ©sultat. Un rĂ©sultat XML affectĂ© Ă  une colonne de tout autre type pourrait ne pas avoir plus d'un nƓud, sinon une erreur est levĂ©e. S'il y a exactement un nƓud, la colonne sera configurĂ©e d'aprĂšs son affectation de la valeur textuelle du nƓud (comme dĂ©fini pour la fonction string XPath 1.0) du type PostgreSQL.

La valeur de chaĂźne d'un Ă©lĂ©ment XML est la concatĂ©nation, dans l'ordre du document, de tous les nƓuds texte contenus dans cet Ă©lĂ©ment et ses descendants. La valeur de chaĂźne d'un Ă©lĂ©ment sans nƓuds texte descendants est une chaĂźne vide (non NULL). Tous les attributs xsi:nil sont ignorĂ©s. Notez que le nƓud text() avec uniquement des espaces blancs entre deux Ă©lĂ©ments non-texte est prĂ©servĂ© et que l'espace blanc au dĂ©but du nƓud text() n'est pas aplati. La fonction XPath 1.0 string peut ĂȘtre consultĂ©e pour les rĂšgles dĂ©finissant la valeur de chaĂźne des autres types de nƓuds XML et des valeurs non XML.

Les rĂšgles de conversion prĂ©sentĂ©es ici ne sont pas exactement ceux du standard SQL, comme discutĂ© dans Section D.3.1.3.

Si l'expression de chemin renvoie un ensemble vide de nƓuds (typiquement quand cela ne correspond pas) pour une ligne donnĂ©e, la colonne sera configurĂ©e Ă  NULL, sauf si une default_expression est indiquĂ©e ; alors la valeur rĂ©sultant de l'Ă©valuation d'une expression est utilisĂ©e.

Une default_expression, plutĂŽt qu'ĂȘtre Ă©valuĂ©e immĂ©diatement quand xmltable est appelĂ©e, est Ă©valuĂ©e chaque fois qu'une valeur par dĂ©faut est nĂ©cessaire pour la colonne. Si l'expression qualifie comme stable ou immuable, l'Ă©valuation de rĂ©pĂ©tition peut ĂȘtre ignorĂ©e. Ceci signifie que vous pouvez utiliser utilement les fonctions volatiles comme nextval dans default_expression.

Les colonnes peuvent ĂȘtre marquĂ©es NOT NULL. Si column_expression pour une colonne NOT NULL ne correspond Ă  rien et qu'il n'y a ni valeur par dĂ©faut (DEFAULT) ni default_expression, elle s'Ă©value Ă  NULL, une erreur est rapportĂ©e.

Exemples :

CREATE TABLE xmldata AS SELECT
xml $$
<ROWS>
  <ROW id="1">
    <COUNTRY_ID>AU</COUNTRY_ID>
    <COUNTRY_NAME>Australia</COUNTRY_NAME>
  </ROW>
  <ROW id="5">
    <COUNTRY_ID>JP</COUNTRY_ID>
    <COUNTRY_NAME>Japan</COUNTRY_NAME>
    <PREMIER_NAME>Shinzo Abe</PREMIER_NAME>
    <SIZE unit="sq_mi">145935</SIZE>
  </ROW>
  <ROW id="6">
    <COUNTRY_ID>SG</COUNTRY_ID>
    <COUNTRY_NAME>Singapore</COUNTRY_NAME>
    <SIZE unit="sq_km">697</SIZE>
  </ROW>
</ROWS>
$$ AS data;

SELECT xmltable.*
  FROM xmldata,
       XMLTABLE('//ROWS/ROW'
                PASSING data
                COLUMNS id int PATH '@id',
                        ordinality FOR ORDINALITY,
                        "COUNTRY_NAME" text,
                        country_id text PATH 'COUNTRY_ID',
                        size_sq_km float PATH 'SIZE[@unit = "sq_km"]',
                        size_other text PATH
                             'concat(SIZE[@unit!="sq_km"], " ", SIZE[@unit!="sq_km"]/@unit)',
                        premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified');

 id | ordinality | COUNTRY_NAME | country_id | size_sq_km |  size_other  | premier_name
----+------------+--------------+------------+------------+--------------+---------------
  1 |          1 | Australia    | AU         |            |              | not specified
  5 |          2 | Japan        | JP         |            | 145935 sq_mi | Shinzo Abe
  6 |          3 | Singapore    | SG         |        697 |              | not specified

L'exemple suivant montre une concatĂ©nation de plusieurs nƓuds text(), une utilisation du nom de colonne en tant que filtre XPath, et le traitement des espaces blancs, des commentaires XML et le traitement des instructions :

CREATE TABLE xmlelements AS SELECT
xml $$
  <root>
   <element>  Hello<!-- xyxxz -->2a2<?aaaaa?> <!--x-->  bbb<x>xxx</x>CC  </element>
        </root>
        $$ AS data;

        SELECT xmltable.*
        FROM xmlelements, XMLTABLE('/root' PASSING data COLUMNS element text);
        element
        -------------------------
        Hello2a2   bbbxxxCC
        

L'exemple suivant illustre comment la clause XMLNAMESPACES peut ĂȘtre utilisĂ© pour spĂ©cifier une liste d'espaces de noms utilisĂ©e dans le document XML ainsi que dans les expressions XPath :

WITH xmldata(data) AS (VALUES ('
<example xmlns="http://example.com/myns" xmlns:B="http://example.com/b">
 <item foo="1" B:bar="2"/>
 <item foo="3" B:bar="4"/>
 <item foo="4" B:bar="5"/>
</example>'::xml)
)
SELECT xmltable.*
  FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x,
                              'http://example.com/b' AS "B"),
             '/x:example/x:item'
                PASSING (SELECT data FROM xmldata)
                COLUMNS foo int PATH '@foo',
                  bar int PATH '@B:bar');
 foo | bar
-----+-----
   1 |   2
   3 |   4
   4 |   5
(3 rows)

9.15.4. Correspondances tables et XML

Les fonctions suivantes font correspondre le contenu des tables relationnelles aux valeurs XML. Elles peuvent ĂȘtre vues comme une fonctionnalitĂ© d'export du XML :

table_to_xml ( table regclass, nulls boolean,
               tableforest boolean, targetns text ) → xml
query_to_xml ( query text, nulls boolean,
               tableforest boolean, targetns text ) → xml
cursor_to_xml ( cursor refcursor, count integer, nulls boolean,
                tableforest boolean, targetns text ) → xml
       

table_to_xml fait correspondre le contenu de la table nommĂ©e, passĂ©e en paramĂštre sous le nom de table. Le type regclass accepte les chaĂźnes identifiant les tables en utilisant la notation habituelle incluant une qualification optionnelle avec le nom du schĂ©ma et les guillemets doubles (voir Section 8.19 pour les dĂ©tails). query_to_xml exĂ©cute la requĂȘte dont le texte est passĂ© avec le paramĂštre query et fait la correspondance avec le rĂ©sultat. cursor_to_xml rĂ©cupĂšre le nombre indiquĂ© de lignes Ă  partir du curseur indiquĂ© par le paramĂštre cursor. Cette variante est recommandĂ©e si des tables volumineuses sont utilisĂ©es car la valeur de rĂ©sultat est construire en mĂ©moire par chaque fonction.

Si tableforest vaut false, alors le document XML rĂ©sultant ressemble Ă  ceci :

<tablename>
  <row>
    <columnname1>data</columnname1>
    <columnname2>data</columnname2>
  </row>

  <row>
    ...
  </row>

  ...
</tablename>

Si tableforest vaut true, le rĂ©sultat est un fragment de contenu XML qui ressemble Ă  ceci :

<tablename>
  <columnname1>data</columnname1>
  <columnname2>data</columnname2>
</tablename>

<tablename>
  ...
</tablename>

...

Si aucun nom de table n'est disponible, par exemple pour une requĂȘte ou un curseur, la chaĂźne indiquĂ©e pour table est utilisĂ©e pour le premier format, et row pour le deuxiĂšme format.

Le choix entre ces formats dĂ©pend de l'utilisateur. Le premier format est un document XML propre, qui sera important pour de nombreuses applications. Le deuxiĂšme format tend Ă  ĂȘtre plus utile dans la fonction cursor_to_xml si les valeurs du rĂ©sultat sont Ă  rĂ©assembler en un seul document plus tard. Les fonctions pour produire du contenu XML discutĂ©es ci-dessus, en particulier xmlelement, peuvent ĂȘtre utilisĂ©es pour modifier les rĂ©sultats.

Les valeurs des donnĂ©es sont projetĂ©es de la mĂȘme façon que dĂ©crit pour la fonction xmlelement ci-dessus.

Le paramĂštre nulls dĂ©termine si les valeurs NULL doivent ĂȘtre incluses dans la sortie. Si true, les valeurs NULL dans les colonnes sont reprĂ©sentĂ©es sous cette forme :

<columnname xsi:nil="true"/>

oĂč xsi est le prĂ©fixe de l'espace de nom XML pour XML Schema Instance. Une dĂ©claration appropriĂ©e d'espace de nom sera ajoutĂ©e Ă  la valeur rĂ©sultat. Si false, les colonnes contenant des valeurs NULL seront simplement omises dans la sortie.

Le paramĂštre targetns spĂ©cifie l'espace de nom XML dĂ©sirĂ© pour le rĂ©sultat. Si aucun espace de nom n'est souhaitĂ©, une chaĂźne vide doit ĂȘtre passĂ©e.

Les fonctions suivantes renvoient les documents XML Schema dĂ©crivant les correspondances rĂ©alisĂ©es par les fonctions ci-dessus :

table_to_xmlschema ( table regclass, nulls boolean,
                     tableforest boolean, targetns text ) → xml
query_to_xmlschema ( query text, nulls boolean,
                     tableforest boolean, targetns text ) → xml
cursor_to_xmlschema ( cursor refcursor, nulls boolean,
                      tableforest boolean, targetns text ) → xml
       

Il est essentiel que les mĂȘmes paramĂštres soient passĂ©s dans l'ordre pour obtenir les projections de donnĂ©es XML correspondantes et les documents XML Schema.

Les fonctions suivantes produisent les projections de donnĂ©es XML correspondantes et les documents XML Schema dans un document (ou forĂȘt), liĂ©s ensemble. Elles peuvent ĂȘtre utiles lorsque des rĂ©sultats auto contenus et auto descriptifs sont dĂ©sirĂ©s :

table_to_xml_and_xmlschema ( table regclass, nulls boolean,
                             tableforest boolean, targetns text ) → xml
query_to_xml_and_xmlschema ( query text, nulls boolean,
                             tableforest boolean, targetns text ) → xml
       

De plus, les fonctions suivantes sont disponibles pour produire des projections analogues de schĂ©mas entiers ou de la base de donnĂ©e courante entiĂšre :

schema_to_xml ( schema name, nulls boolean,
                tableforest boolean, targetns text ) → xml
schema_to_xmlschema ( schema name, nulls boolean,
                      tableforest boolean, targetns text ) → xml
schema_to_xml_and_xmlschema ( schema name, nulls boolean,
                              tableforest boolean, targetns text ) → xml

database_to_xml ( nulls boolean,
                  tableforest boolean, targetns text ) → xml
database_to_xmlschema ( nulls boolean,
                        tableforest boolean, targetns text ) → xml
database_to_xml_and_xmlschema ( nulls boolean,
                                tableforest boolean, targetns text ) → xml
       

Ces fonctions ignorent les tables qui ne sont pas lisibles par l'utilisateur courant. Les fonctions sur la base entiÚre ignorent en plus les schémas pour lesquels l'utilisateur actuel ne dispose pas du droit USAGE.

Notez qu'elles peuvent produire beaucoup de donnĂ©es, entiĂšrement stockĂ©es en mĂ©moire. Lors de demandes de crĂ©ation de contenu Ă  partir de gros schĂ©mas ou de base, il peut ĂȘtre intĂ©ressant de rĂ©flĂ©chir Ă  traiter les tables sĂ©parĂ©ment, potentiellement mĂȘme via un curseur.

Le rĂ©sultat d'un contenu de schĂ©ma ressemble Ă  ceci :

<schemaname>

table1-mapping

table2-mapping

...

</schemaname>

oĂč le format de correspondance de table dĂ©pend du paramĂštre tableforest comme expliquĂ© ci-dessus.

Le rĂ©sultat d'un contenu de base ressemble Ă  ceci :

<dbname>

<schema1name>
  ...
</schema1name>

<schema2name>
  ...
</schema2name>

...

</dbname>

oĂč la correspondance de schĂ©ma est indiquĂ©e ci-dessus.

Comme exemple d'utilisation de la sortie de ces fonctions, Exemple 9.1 montre une feuille de style XSLT qui convertit la sortie de table_to_xml_and_xmlschema en un document HTML contenant une reprĂ©sentation en tableau des donnĂ©es de la table. D'une façon similaire, le rĂ©sultat de ces fonctions peut ĂȘtre converti en d'autres formats basĂ©s sur le XML.

Exemple 9.1. Feuille de style XSLT pour convertir un rĂ©sultat SQL/XML en HTML

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/1999/xhtml"
>

  <xsl:output method="xml"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN"
      indent="yes"/>

  <xsl:template match="/*">
    <xsl:variable name="schema" select="//xsd:schema"/>
    <xsl:variable name="tabletypename"
                  select="$schema/xsd:element[@name=name(current())]/@type"/>
    <xsl:variable name="rowtypename"
                  select="$schema/xsd:complexType[@name=$tabletypename]/xsd:sequence/xsd:element[@name='row']/@type"/>

    <html>
      <head>
        <title><xsl:value-of select="name(current())"/></title>
      </head>
      <body>
        <table>
          <tr>
            <xsl:for-each select="$schema/xsd:complexType[@name=$rowtypename]/xsd:sequence/xsd:element/@name">
              <th><xsl:value-of select="."/></th>
            </xsl:for-each>
          </tr>

          <xsl:for-each select="row">
            <tr>
              <xsl:for-each select="*">
                <td><xsl:value-of select="."/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>



[8] Un rĂ©sultat contenant plus d'un nƓud Ă©lĂ©ment au niveau haut ou du texte sans espace blanc Ă  l'extĂ©rieur d'un Ă©lĂ©ment, est un exemple de forme contenu. Un rĂ©sultat XPath peut ĂȘtre de toute forme, par exemple s'il renvoie un nƓud attribut sĂ©lectionnĂ© Ă  partir de l'Ă©lĂ©ment qui le contient. Un tel rĂ©sultat sera placĂ© dans sa forme contenu avec chacun des nƓuds non autorisĂ©s replacĂ©s par sa valeur de chaĂźne de texte, comme dĂ©finis pour la fonction string XPath 1.0.