Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
td_histoire_numerique:exercice_3 [2016/01/04 19:01] Francesco Beretta [Requêtes SQL / XPath] |
td_histoire_numerique:exercice_3 [2016/01/04 19:04] Francesco Beretta [Titre] |
||
---|---|---|---|
Ligne 98: | Ligne 98: | ||
</code> | </code> | ||
- | ===== Documentation ===== | + | ====== Documentation ====== |
+ | |||
+ | |||
+ | |||
+ | ===== Code SQL ===== | ||
+ | |||
+ | Dans cette section on trouvera le code des principales fonctions SQL/PLpgSQL utilisées dans la base de données | ||
+ | L | ||
+ | === Fonction vues.transformation_xml(integer) === | ||
+ | |||
+ | Cette fonction transforme le texte codé avec le système des accolades en un document XML. | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | -- Function: vues.transformation_xml(integer) | ||
+ | |||
+ | -- DROP FUNCTION vues.transformation_xml(integer); | ||
+ | |||
+ | CREATE OR REPLACE FUNCTION vues.transformation_xml(integer) | ||
+ | RETURNS character varying AS | ||
+ | $BODY$ | ||
+ | WITH tw0 AS | ||
+ | ( | ||
+ | -- transforme les entités XML | ||
+ | SELECT REPLACE(REPLACE(REPLACE(texte,'&','&'),'<','<'),'>','>') txt | ||
+ | FROM objets.objet | ||
+ | WHERE pk_objet = $1 | ||
+ | ), | ||
+ | tw1 AS | ||
+ | ( | ||
+ | -- transforme les accolades en chevrons | ||
+ | SELECT REPLACE(REPLACE(REPLACE(txt,'{/','</'),'{','<'),'}','>') txt | ||
+ | FROM tw0 | ||
+ | ), | ||
+ | tw2 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères qui contiennent le type après l'id de l'objet: ajoute l'attribut "type" | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d\|]+)([a-z]{2})(_?)([\d|\|]*)(>)','\1\2\4\5 type="\3"\6','g') AS txt | ||
+ | FROM tw1 | ||
+ | ), | ||
+ | tw3 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies d'un 0: élimine l'attribut "ref" tout en gardant l'attribut @type | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})(0)(_?)([\d|\|]*)([\s"=\w]*)(>)','\1\3\4\5\6','g') AS txt | ||
+ | FROM tw2 | ||
+ | ), | ||
+ | tw4 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies ou non d'un id possédant un '_': ajoute l'attribut @ana | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d|\|]*)(_)([\d\|]*)([\s"=\w]*)(>)','\1\2\5 ana="\4"\6','g') AS txt | ||
+ | FROM tw3 | ||
+ | ), | ||
+ | tw5 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies d'un id : ajoute l'attribut @ref | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d\|]+)([\s"=\w|]*)(>)','\1 ref="\2" \3\4','g') AS txt | ||
+ | FROM tw4 | ||
+ | ), | ||
+ | tw6 AS | ||
+ | ( | ||
+ | -- traite le cas de balises seg et eud possédant un '_': ajoute l'attribut @ana | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(seg|eud)(_)([\d|\|]*)(>)','\1\2 ana="\4"\5','g') AS txt | ||
+ | FROM tw5 | ||
+ | ), | ||
+ | tw7 AS | ||
+ | ( | ||
+ | -- traite le cas des dates avec un paramètre d'incertitude en ajoutant l'attribut @cert | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)(r|p)(_?)([a-z]{2})(>)','\1\2\3\5\6 cert="\4"\7','g') AS txt | ||
+ | FROM tw6 | ||
+ | ), | ||
+ | tw8 AS | ||
+ | ( | ||
+ | -- traite le cas des dates avec un type en ajoutant l'attribut @type | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)(_)([a-z]{2})','\1\2\3 type="\5"','g') AS txt | ||
+ | FROM tw7 | ||
+ | ), | ||
+ | tw9 AS | ||
+ | ( | ||
+ | -- traite le cas des dates en ajoutant l'attribut @when | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)','\1\2 when="\3"','g') AS txt | ||
+ | FROM tw8 | ||
+ | ) | ||
+ | UPDATE objets.objet | ||
+ | SET texte_xml = (concat('<root>',REGEXP_REPLACE(txt, '\|', ' ' , 'g'),'</root>'))::xml | ||
+ | FROM tw9 | ||
+ | WHERE pk_objet = $1; | ||
+ | |||
+ | SELECT 'Effectué'::varchar AS resultat; | ||
+ | |||
+ | |||
+ | $BODY$ | ||
+ | LANGUAGE sql VOLATILE | ||
+ | COST 100; | ||
+ | ALTER FUNCTION vues.transformation_xml(integer) | ||
+ | OWNER TO postgres; | ||
+ | |||
+ | </code> |