{"id":38,"date":"2020-06-17T03:45:08","date_gmt":"2020-06-17T01:45:08","guid":{"rendered":"https:\/\/www.olivierlange.com\/?p=38"},"modified":"2020-06-17T03:45:08","modified_gmt":"2020-06-17T01:45:08","slug":"procedure-stockee-et-trigger-sous-mysql","status":"publish","type":"post","link":"https:\/\/olivierlange.com\/index.php\/2020\/06\/17\/procedure-stockee-et-trigger-sous-mysql\/","title":{"rendered":"Proc\u00e9dure stock\u00e9e et Trigger sous mysql"},"content":{"rendered":"\n<p>Que sont les proc\u00e9dures stock\u00e9es? A quoi servent-elles?<\/p>\n\n\n\n<p>Si je prends l\u2019exemple de la programmation traditionnelle, une proc\u00e9dure stock\u00e9e pourra \u00eatre attribu\u00e9e \u00e0 une fonction. Plut\u00f4t que de r\u00e9ecrire sans arr\u00eat la m\u00eame chose, je cr\u00e9e une proc\u00e9dure stock\u00e9e qui va me faire mon travail. Je peux lui passer des param\u00e8tres (ou non). Par contre, ma proc\u00e9dure ne me retournera rien. Elle se contente de faire ce que je lui demande (a contrario d\u2019une function sous mysql qui elle pourra me retourner 1 ou plusieurs enregistrement)<\/p>\n\n\n\n<p>Un exemple basic, tir\u00e9 de la documentation MySQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>delimiter \/\/\nCREATE PROCEDURE simpleproc (OUT param1 INT)\nBEGIN\nSELECT COUNT(*) INTO param1 FROM t;\nEND \/\/\ndelimiter ;<\/code><\/pre>\n\n\n\n<p>Il suffira de l\u2019appeler (call simpleproc(@toto)) pour r\u00e9cup\u00e9rer le retour du count. Notez les 2 commandes \u201cdelimiter\u201d avant et apr\u00e8s la cr\u00e9ation de la proc\u00e9dure stock\u00e9e. C\u2019est n\u00e9cessaire afin de pouvoir disposer du ; de fin de requete dans la proc\u00e9dure, sinon mysql ne sait pas faire la diff\u00e9rence entre le code dedans et dehors (il interpr\u00e9terais le ; comme \u00e9tant la fin du CREATE, et donc g\u00e9n\u00e8re une erreur).<\/p>\n\n\n\n<p>Et le trigger maintenant?<\/p>\n\n\n\n<p>Pour ceux qui ont des notions d\u2019\u00e9l\u00e9ctronique, le trigger est un \u00e9l\u00e9ment qui r\u00e9agit \u00e0 un changement de statut (par exemple, on mets un trigger sur un \u00e9tat de sortie, et quand cet \u00e9tat change, on envois un signal. Il r\u00e9agit donc non pas sur un \u00e9tat 0 ou 1, mais bien sur le changement d\u2019\u00e9tat, de 0 VERS 1). Sous MySQL, c\u2019est la m\u00eame chose, ou presque. Le trigger va r\u00e9agir \u00e0 un update, insert ou delete d\u2019une table bien pr\u00e9cise, et va ex\u00e9cuter du code lorsque cela arrive.<\/p>\n\n\n\n<p>L\u2019utilit\u00e9? par exemple mettre a jour par MySQL une table li\u00e9e en MyISAM (cela \u00e9vite que le d\u00e9veloppeur l\u2019oublie dans son code PHP). Ou, et c\u2019est \u00e0 cela que je voulais en venir, mettre \u00e0 jour une table interm\u00e9daire en MEMORY\u2026 Car c\u2019est bien la que se trouve la puissance d\u2019une optimisation de base de donn\u00e9es\u2026 R\u00e9ussir \u00e0 mettre ensemble tout les outils mis \u00e0 notre disposition\u2026<\/p>\n\n\n\n<p>Pour cela, et ce sera l\u2019objet d\u2019un autre billet, nous allons int\u00e9grer 3 outils de MySQL en une action:<br>&#8211; Une table MEMORY<br>&#8211; Un trigger<br>&#8211; Une proc\u00e9dure stock\u00e9e<\/p>\n\n\n\n<p>L\u2019objectif? Disposer d\u2019une table contenant de nombreuses donn\u00e9es, ou des donn\u00e9e provenant de multiples tables, disposant d\u2019un temps d\u2019acc\u00e8s tr\u00e8s faible (je compte en 100 et 1000 fois plus rapide la r\u00e9cup\u00e9ration de donn\u00e9e d\u2019une table MEMORY a une table MyISAM\u2026), mais en permanence \u00e0 jour\u2026<\/p>\n\n\n\n<p>Mais, et ce sera la conclusion de ce billet, pourquoi ne pas utiliser une view, certains me diront? Effectivement, tant que les cas restent simples, avec peu de donn\u00e9e, une view est efficace, mais quand on doit synth\u00e9tiser des donn\u00e9es venant de plusieurs tables, avec des if, des sous-requ\u00eates, des jointures multiples, des op\u00e9rations, on se retrouve rapidement \u00e0 passer de tables a 10\u2019000 donn\u00e9es a plusieurs milliards dans la requ\u00eate (table temporaire)!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Que sont les proc\u00e9dures stock\u00e9es? A quoi servent-elles? Si je prends l\u2019exemple de la programmation traditionnelle, une proc\u00e9dure stock\u00e9e pourra \u00eatre attribu\u00e9e \u00e0 une fonction.&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/olivierlange.com\/index.php\/2020\/06\/17\/procedure-stockee-et-trigger-sous-mysql\/\">Continuer la lecture<span class=\"screen-reader-text\">Proc\u00e9dure stock\u00e9e et Trigger sous mysql<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,10],"tags":[],"_links":{"self":[{"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/posts\/38"}],"collection":[{"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":1,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":39,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/posts\/38\/revisions\/39"}],"wp:attachment":[{"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olivierlange.com\/index.php\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}