{"id":6011,"date":"2016-06-15T11:23:52","date_gmt":"2016-06-15T10:23:52","guid":{"rendered":"http:\/\/blog.capdata.fr\/?p=6011"},"modified":"2019-09-13T13:01:31","modified_gmt":"2019-09-13T12:01:31","slug":"chainesoracle","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/","title":{"rendered":"Les Chaines Oracle"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011&#038;title=Les%20Chaines%20Oracle\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Les%20Chaines%20Oracle&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Hello amis dba&#8217;s et bienvenue sur cet article !<\/p>\n<p>Au menu aujourd&#8217;hui un cas concret d&#8217;utilisation d&#8217;un sujet assez peu abord\u00e9 et pourtant bien utile: les chaines Oracle.<\/p>\n<p>Les chaines sont un composant du planificateur Oracle qui permet de g\u00e9rer une s\u00e9rie d&#8217;actions d\u00e9clench\u00e9es hi\u00e9rarchiquement un peu \u00e0 la mani\u00e8re d&#8217;un ordonnanceur. On r\u00e9alise une action A si celle-ci \u00e9choue on part sur une action B sinon on lance C etc etc..<\/p>\n<p>Dans le cas d&#8217;utilisation qui suit nous \u00e9tudions un calcul de statistiques hebdomadaire sur une base de un peu plus de 1 To qui dure approximativement 28h et pour lequel un client nous demande une am\u00e9lioration.<\/p>\n<p>Nous partons d&#8217;une \u00e9dition standard (donc pas de parall\u00e9lisme) en 10.2.0.4 et passerons sur les modifications faites \u00e0 la commande de calcul elle-m\u00eame (auto-echantillonnage, exclusion des tables de travail applicatives etc)<\/p>\n<p>Globalement partant de l&#8217;id\u00e9e qu&#8217;un calcul de statistiques r\u00e9alise  un calcul s\u00e9quentiel par objet nous allons &#8220;simuler&#8221; une forme de parall\u00e9lisme en nous appuyant sur les chaines:<\/p>\n<p>Une chaine est associ\u00e9e \u00e0 un job qui est cr\u00e9\u00e9 dynamiquement par Oracle ou d\u00e9fini explicitement, ce job lance lui-m\u00eame des programmes ou d&#8217;autres chaines imbriqu\u00e9es qui cr\u00e9ent elles-m\u00eame d&#8217;autres jobs qui lancent des programmes. Si vous n&#8217;avez rien compris c&#8217;est normal moi non plus \ud83d\ude42 donc voyons de quelle mani\u00e8re cela peut \u00eatre utile pour notre cas.<\/p>\n<p>Nous souhaitons avoir une proc\u00e9dure qui accepte en param\u00e8tre  le &#8220;degr\u00e9&#8221; de parall\u00e9lisme et en param\u00e8tre optionnel le nom du sch\u00e9ma concern\u00e9 par le calcul de statistique (par d\u00e9faut la valeur est % donc tous les sch\u00e9mas seront embarqu\u00e9s s&#8217;il n&#8217;y en a pas un de pr\u00e9cis\u00e9). En substance nous allons cr\u00e9er une premi\u00e8re chaine &#8220;MASTER&#8221; qui lancera en simultan\u00e9e autant de chaine &#8220;SLAVE&#8221; que le degr\u00e9 de parall\u00e9lisme indiqu\u00e9. Chaque chaine &#8220;SLAVE&#8221; se verra attribuer des t\u00e2ches qui seront elles-m\u00eames lanc\u00e9es s\u00e9quentiellement, chacune de ces t\u00e2ches correspondantes a  un calcul de stats pour une seule table. la proc\u00e9dure est l\u00e0 pour cr\u00e9er dynamiquement le jeu de chaine qui va bien pour arriver \u00e0 cette organisation (merci paint pour la qualit\u00e9 irr\u00e9prochable de ce sch\u00e9ma :)):<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAowAAAFrCAIAAADU+E8mAAAgAElEQVR4nO3d93dj533ncfxBe\/aXPckeY511VrJ6md44heSUy957LwArWMDOqRppJI+KZUuWBTuxbCdKZDuRS2RvZFlIlHWV1l7FkkYzJFHusz8ABG55LnABAuAF8H4dnDnD20Hwfj94nvsA1yUAAIAjufb7AAAAgBwhDQCAQxHSAAA4FCENAIBDEdIAADgUIQ0AgEMR0gAAOBQhDQCAQxHSAAA4FCENAIBDEdIAADgUIQ0AgEMR0gAAOBQhDQCAQxHSAAA4FCENAIBDEdIAADgUIQ0AgEMR0gAAOBQhDQCAQxHSAAA4FCENAIBDEdIAADgUIQ0AgEMR0gAAOBQhDQCAQxHSAAA4FCENAIBDEdIAADgUIQ0AgEMR0gAAOBQhDQCAQxHSADQCisvlcvuD1ksE\/W6XEsj5PtPsFShPhDRQvox5G\/85dQznOqSDfrfbHxQioCQ3G\/S7SW1AENJAOcsqb\/Md0gHF5XL7A343IQ0Q0kC58rtdCfE4DCanJWPYODEW0vEuan1zV7OoJMctV4xP0q0RJKQBQUgD5UzfKA4ou6moSchYuzaoWUDXFR1QkuGq\/b8sYy1XtDo0QhogpIFykWjkJqZY9lwnZkiy1Jjs8Sw1pmpiRroV5QhpQAhCGigfaUNa21vtSoS0rEFsEdIGhDSwV4Q0UBa04ZmYqItNY291Fi3p1OPJCGkgY4Q0UPqkCS0MSajJ44CSGMclvyYty9q0sUpIAxkjpIESZ5XQQiT7qGNxqBl47Vd0rWpt93WKrNV3edvsJzdKHIXFZoByQkgDpSxVQgNwPM5boGSR0ECx49QFShMJDZQAzl6gBJHQQGngBAZKDQkNlAzOYaCkkNBAKeE0BkoHCQ2UGM5koESQ0EDp4WQGSoH++z84r4ESwckMlAISGihJnM9A0SOhgVLFKQ0UNxIaKGGc1UARI6GB0saJDRQrEhooeZzbQFEioYFywOkNFJ88JnRAcaW5hbP+ttA52yc3jgYkCGmgyOQwoY15G\/85dQznOqSDfrfbHxQioMQ2G\/S7Nc8wt28HgGJDSAPFJLdt6KzythAhTTQDMYQ0UDRym9DaBmu8p1nTiE3GpHFiLETjXdT6TmptI9ics5YrxifF1yCkgSRCGigO+bgOrc\/DgLKbm0G\/ezdDA0oyTmMLxJJYM3t3C9r\/a7ag25t0RfNBuUxBDpQnQhooAnkaKWbZaE3MkGSpMdnjSWqM5cSMdCumPjwa1ShvhDTgdC69HG7ZENKSIVuSKE0R0gZ7DelU7W2gPBDSgNPlKaGFITaNvdVZtKRT52nmIS3rNAfKCiENOFr+EloYQlCTxwElMY5Lfk1alrVpE9VWSCcvjOv3DZQnQhpwrrwmtBDJPupYFGoGXvsVXata232dImv1Xd42+8kNEgfBuDGAkAYcK+8JDcDxOPkBJyKhAQhCGnAgEhpADCUAcBYSGkACVQBwEBIagBaFAHAKEhqAAbUAcAQSGoAZ5QDYfyQ0ACkqArDPSGgAVigKwH5y6e334QBwFooCsJ9IaAApUBeAfUNCA0iN0gDsDxIaQFpUB2AfkNAA7KBAAIVGQgOwiRoBFBQJDcA+ygRQOCQ0gIxQKYACIaEBZIpiARQCCQ0gC9QLIO9IaADZoWQA+UVCA8gaVQPIIxIawF5QOIB8cent9+EAKD4UDiBfSGgAe0TtAPKChAawd5QPIPdIaAA5QQUBcoyEBpArFBEgl0hoADlEHQFyhoQGkFuUEiA3SGgAOUc1QRaCfrdLCez3UTgJCQ0gHygoyEJmIR1QXC63P7jHfQaURAru7tryMGLLamcF\/W6XcdnE6kG\/W\/etI+aDjS1h9SRIaAB5Qk1BFgrektZlbECJp6XVYQQUl1tRDPMCistqQuqnE3uPEfC75SFNQgPIH8oKbNA0NRNNTyWQaNtqwsu4pBC6eLReUdecNSVmUBqRFuEaUFxuf9A005DSpqNK\/yswH0EJJnRASdFnIITIx1u0+B\/E3rtbgJJTKpUF+aTpro61YnW9v5q0S7RxdZlmiEPZirr\/y\/JQ2t8sT4tYRks2o0tp4w6zCOkSSGjjM4\/\/nPoXkuuQDvrdbn9QiICi6dmwfL8GlJdiLS4oJOuruUKIZCpaLWLZZk2saExA6RYTV6UTs2RpodlUqpTW7cFwTVqaC8aNufQkaxSDrPI2zyG9+6OQjyQAykuxFhfklSF7pO1aaUjr4y6jkDaw7PoM+t0uzWqStw+6ENdtJ7GC\/l1ANi3pEkho7S9d877G9FbF\/sWONG1gyxXjk+Rr0AmOslas9QV5ZQxpmy1piy5keyFtv8GkG5WtXy1d2seLvqGlvqeQtnvUjmR8PSRXKwK2L3Zkds3CNJBPxtZCQCkr7hKDfDC3EaVlOnVIB5RMWtLpWkyaHlBtakjHhplC2XTR1e22amCnUCJtOsMra\/nMtX0ONt+ipb9mYeMqiWlHJfA7B\/aCkIaOoRkan5psoMrSUVNtNV2ZfiWDkBbGRrC8EWaYZ2g3u92SK5jGkImtk7r9rd+55gPa0kMrHuZX1hDSkqsVkijN+ppFZiGdm4\/XA0WOkIaOPKRR\/KSvrC42pVcrMmtJp+6PyCCkSWgghiqMJGNDiJAuCSleU12HsvxqhfyadBbXLGyHtGZoIFD2qMJIIqRLT5oXdLePOjmoIP5j8mqF\/Ysddq5ZpA9p4+UFho6hrFGFEWdOaEK6qPFqAiWA8xZx2lJOWS92xDNQGjh7IYTkg9EU9yJGQgMlgxMYkk\/mUN+LFPEMlBhOY0gimSpfjEhooPRwJpc7aVmn0BcdEhooSZzM5U5a1qn1RYR4BkoYp3RZsyruVPxiQUIDpY2zuqxZFXeKvvO5TPb7iADkHid2+UpR36n7Dkc8A2WC07t8pSjxVH8nI6GB8sEZXqZSV3kCwJmIZ6DccJ6XqdSFnhhwIBIaKEOc6uUoba0nCRzFZbLfRwSgQDjby1HaWk8YOEdB4zmguNLcyll\/u8mc7ZMbSANyVOGyY6fcE9IOkdeENuZt\/OfUMZzrkA763W5\/UIhA8v7V2rtSE90od1Th8mKz4hPS+64ADeis8jbvIR30u4lmIIEqXF5sFn1Cen8VIKGTjdVEc1XTgE3GsHFiLKTjXdT6lq5mUUmOW64YnxRfI6AQ0YAGVbiM2K\/7hPR+cZnkb1\/6RnFA2Q1HTVs2oCTjNLZALIk1s3e3oP2\/rDVsuaJpKbdb8mYBKFNU4TJiv+4T0vuiYPEcY9lznZghyVJjssdj1xjL5gaxxYoG2ncFQb+bmEbZowqXi4yqPyFdeAVOaGEKaW1vtSsR0rIGsUVIG2Qd0roBZPR9o8xRhctFRtWfkC6kQnZxa+li09hbnUVLOnWj115I63KZkAYI6fKQaQAQ0gWzL\/Eco8tATR4HlN2WtMU1aVnWpg1UeyFtdUEcKFdU4bKQaQYQ0oWxjwktRLKPOpaEmoHXfkXXqtZ2X6fIWn2Xt81+cuujcnFBGiCky0EWMUBI59s+xzOAIkF1KH1ZJAHhkVckNACbKBAlLrswID\/yxGWy30cEwNGoESUuuzAgQvKBeAaQKSpFKcs6DwiSnCOhAWSBYlGy9hIJZEkOEc8AskbJKFl7SQUSJVdIaAB7QdUoTXsMBkJl71wm+31EAIoPhaM07TEYyJU9Ip4B5ATlowTtPR5Il70goQHkChWkBO09HgiY7BDPAHKLOlJqchISKbeQ\/oZH5YmEBpBzlJJSk5OQyGFI5+ZWRombP0jupyhfVjsr6Hdb33LReCdkyW2QjbuWIKEB5APVpKTkKiec1ZLWZWzshokpDiOguNyKYphnujFyckLKpxP0u3dDW5b0QhDPAPKJmlJSchUVuu0Ybx0YSzXNjQ0TLU\/ZTQY18Wi9Yur2qvxWxRbhGrsHommmIaVNR2XjlyI7DBIaQF5RVkpHDqNCsyltd3WsFRsL1Pg0Tdol2ri6ODPEoWxF3f9lUahbUTvRHK679yk2bUaX0sYd2gppU2uchAaQb1SWEpHbtEhuypRMxlTbTUWrRSzbrIkVjXkq3WLiqnRilixcNZtKldK6PRiuSVvltXF7xDOAAqC+lIjcBoYupGXtWmlI6+Muo5A2sBxpFvS7XZrVJG8fdCGu205iBf1zstWSNg9\/I6EBFAAlphTkvFWXTUvaogvZXkjbH4imG5WtXy1d2sdj2\/C+I\/3uczNAHQAyR0iXgpy36jQblF+TTh3SASWTlrTFwLAEzQhr7eFIx4aZQtn0USy326qBbbVzEhrAviGki14+Lo7qNphsoMrSUdMu1Yzb9isZhLQwNoLlA8cM8wztZrdb8gkpYz9AbJ3U7W\/ThWw9vsYFQAER0kUv5wmdp20CADJFFS5u+WhGC0IaAJyBKlzc8pSmhDQAOAFVuIjlqRktCGkAcAaqcBHLX5QS0gDgBFThYpW\/ZrQgpAHAGajCxSqvOUpIO41aEIZ9pd67zWOzWqxgvzqgqFGFi1K+Q5SQdpo9pq9Nhn2l3rvNY7NarGC\/OqCoUYWLT147ug27yNP2kak9pm9GbO7d5rFZLVaI3xpQ\/KjCxacACUpIO01u4tcem3u3eWxWixXitwYUP6pwkSlAM1oQ0s6Tm\/i1x+bebR6b1WKF+K0BxY8qXGQKE5+EtNNEhRoVqqoKVY2lXURoH1H9j6aHNh2jqoj9G1XTpG9SfC+6LQgRjT9S7jqxmKpGVM2RCCFUIXQ7U4VQ4xNV81wbMl0lu70AhUQVLiaFaUYLQtp5wkKNCBHaDgtV3Pvs00nPsGe4d3FybHnGOzsysDblnR3rnfcOTQz2zHtH5sZHFyZGp4b7xvs6J4d6x\/s6Z8YHF2Y8X7196\/NPPo5GQtFIKBIVd7ZC8bhVIyIW2oZHIsQiERGNhLZ3wuGoECIcUYUaffHpK6uzY6s+7+rs2Nr06Mbs+OrUyJX5idXZseXpkdXZsZWZ0Y157421uafW51965vI3X3om8PKz\/\/z3b7z7kx+J7c\/C9z4R0W0hQtt3PollczzxMwzpSCSyvfWZECERDYnodnj7zscf\/e63H7z\/zg\/f+tH33gh8\/fbl5dmJ4d5nr11++blnXv3q898JfOPN7\/7Nz\/75B6G7n6oipO6+jVBFNM+vIZANqnAxKVh2EtJO8+ndbVWI7Tsff+32U+P9PZ1NNQOdjUvTY+u+idUZz5J32NPbPtHfOTPcP9Hf++JT1\/uaaztqz7cpVX3Ntd0Nl0ba63zDXfOjvfOe\/qXpsedubO5s3xMinsVCjYhoSPJQw7FHfDEhhBDhcDiy9enS9MiSp39lYnDJO7gxMbDu7d+cHFwe7V4a6Zrrb14calse7Vwe7VwZ69qY6r88M7jq7Yk9Lk8NXZ4YvDI9uObpWfX2XFsYE5F74TufJJ9qVP9Ik9lRNbT1\/i\/efnpzcXVqbGG0a6xDmelrnOio8bZemmhTrvuGRpqqp7sbl0e7b\/lnxttqJjrrPe21k10Ny2M96zNjX7m++X+CvxQipIpw3l9FIHNU4aJRsGa0IKSd57NP7wlVdDadHeu61FlTPTM6MO8durW5\/JWra5vzU+u+iZnh\/umhvsmBvnfeeuuDn\/\/89rX1lovnnruy+t5Pfvj6i8++eH31hWsrS97B7rrqhbG+p9bmnr2+8fknHyf7rlO2pENChITYCW8LNaRGd3zDzSuezvmBluYzh4\/d98VTD37p1INfqnjor4\/d9z+O3\/\/FY\/d\/ofrAAxcPPxz798Khh2qOPdZ0+lDXhVP9tec8jRenmmtWhtoXepvWRztWhlo3p4ZurS8IEY4IERHC3JROFdJq+PbNK\/Oe\/rnhromOOk9rtbfl3IBybLDm+Fh9hbfp7HhjZf\/FE2MNVf0XTvdUnRyoOTdQc67nQkW\/ctbTogzWVk52NW3Mjgff\/RdV7Aga03AeqnDRKGRwEtJO87vgB5MDfSPt1TUnHjp\/9FDlsSMXK06ePXKo+sSx6lPHz1ecuHT6VM3Z0xdOnayrrKqvqq6vOld1\/GjFwSe7GuqGOtpG+nv6u7sGerrffOONX\/\/ql2+\/+Z3lmXH\/1KhQQ6GdrVg6RoTYConE\/2OPu9vReztqOBpS1YhQw0JsX9tYWuyvme+vu3TkEU9rXcuZ43WV504cOlJ34dL5M+cuVVY3XKhur6\/tamroa2vpb28d7Gzva2vpaWka7u7saKjrqKlprqqqPHTw9BOPVh5+\/MyBR+b6W1cm+q+uzqkiGlKjkd2+\/XhmCxENR3a2to3hrYpIKDznGZwc7OipqxpsuFB\/\/LGKx++vPPxoTcXhlvMV9WePXTp58FLF8dqzpxqrKxsqK5WKitqzpxuqznXUKk3nq5ovVLeePVF\/4lBL1anhruZ3fvwDIaKRSGSfX2lAjypcHArZjBaEtMPcu3dvor\/b09XYWnXk0tFH6yrPdbW09Le1v\/nGG7\/9jw\/+9MeP7n7+WXT77vadTz76zW9+828f\/Dr472+\/9daP3nzz5du3X759e2NpyTs+0dbW0drc1t3Z9cqLX\/3Dv7\/nG+tdmhr+3utfE2pIN7wrGo6PBRNRoUaikdCnn\/zn5x9\/+P9+\/x\/v\/uQHP\/zet+a9QyvDTX01p84dePjBL\/y3737thX\/92Tv\/9v5\/\/NMPf\/z97775ytde+8pXnn\/qqafX1zcXF5d8vvnR4bGxkfGhgeGRodHB\/qHO9p6O5s62hpaV+cWhrg7l3JnvvfrCsnfg6Y0FoYaFEKoIax9CDUe374rITqLvPfH47QfBxYkBT3fT6tTYZE9nf8PFusqzytlzvS2tfR0dfV2dXW2tna0tIwP98zOzc1O+2YmZuSnf3JRvsGdgdGCkt6Ons76up7G+9uzpFqV6bW7qB2\/9QxavTkBxuZRArl9zBwr63S63P7jfh5FKSb4WVOHiUODUJKQdJRKJeHtqJjvOz\/V3Dze3vfeLXwo1PogsElHDQkSEUNVINKq7qhqNXdBVRSgUEZGoCEVEJPLeT3987sih1tpLU0OdGzPDz6zOePvblsd6FgabZ3vr\/cOtYy3Vi0Mtc\/2NMz11K2MdnrYL0921vr6muf7m5bG+q3MTox0NM12NG9Njf\/lf\/8uXv+g+fejAEw8\/INSwCG2J8LYIbyc6jSMxobC253xnOxqJH7H415+8\/eh9Xxof6vvk979eGh9Yn57enFtYHB+cHeqZ6u8c62xeHB9cnBxZmfUsTo6s+ryLkyP+qdGlydHLC9Mbc5P+iZFFT8+Sd0CpqDj80GMiHA3f3RKRxJV2IYTYHRomotFoNCrUSDR2MGokKlQRiYpXvv763JTvO1\/\/+mhb86p\/UQiR6cfDijQYgn53RocdUAqd0IYjDCiutEdQpK9FalThIlDgZrQgpB3mu6+\/NjdQN9J8ZrSnvbO5WRWhqIh\/hios4g\/jeCvDQxXT3rHVxbn+jqbOhotN58\/Mj\/YujQ+sTQ2vT42uTY+sTg1fnvOsTg2vTg2vTvevTvcvT\/auzQyszw5uzg3fnB28OTt4ebLnylTvlam+69M916f6rs2Ork+NLng9zfUNW3fvbd\/bUlU1cWDmEeKxH0Ph+KXlt99+u7Gh7sCTj1adPnFjY8nvGXh2bWGwSfF2N3i66vsbq1vPn5jsbRrvrh3tVLy99TNDLZ6euumeJk9Xo6er0dPd5J8cHO5suLm2+Nd\/+Rf3fcH9xEOPjPQPb90NST\/KJX2IqBqJRD788EPP8Ph4z9BYR6uIRiMRNaMu7yINhkxDuvCyOMIifS1Sc2wVdv6fUOEUPjIJaUfpbW5aHO4caau9UFEZ\/1hyLA41j9T+\/vt\/NzY0PDs5sbro62qt722+ONZVN95dP9KmjLQpY63KeFuNt6Nuprd5frB9caR9YbhtYbhtbrBlcaR9caR9Zbx3abTb19+6PNazONw52VnrbVf6lMqR1obNxeXO5uZ\/++X\/Dm99LtSQKkJCDYloJPlQo7qUVoVQxbs\/f8c7Mrjim17xTa\/5Zha9owujPSuj7Suj7cuDzQu99XPdtQu99Qu99UuDDUuDDf6B+pXhpuWhxpXB5sWehoXuel9v\/Xx\/43x\/43xfs3+kZ6S14fLC3Obi8triSiKBhYiK5NuY2EP\/5iX2RicamZ32jXYNTPZ0vnL7eTUqsg\/poN+9e+7sTouVsoASn6xpDFosbJwmgn632x9MbEEJJBfTNi2t1jXvXbuksXWqmZeYI91y\/KnHJ8aOMblHzSLJHezpCPUBLD8kQrqQMgtpOz0hdvboMr\/EsT8e\/cZj0wxL7v59JP7atLTnleRvVMvwPBLT9\/TkMrQvO4WV7qZm33DvdH\/PtbVrIiIioYy\/gOzb3\/7ba1euBn\/1\/ke\/+\/VLz9\/yjfU2Vh5vPH+y5uyRS6cPXTz+RO2JA5VPPlh98OGqAw+dfvS+04\/ef+axL5948EtnHvvymce+fPrg4ycef\/jJ+7906MH7Hv6rLxx96H9VH36i5sSJrrq64d7BsYGB8N27IhqNf6eKxee4dqdERTT6nddfH+xsX\/PNvvfTn\/zx17\/5p+9\/b7ilfqiuarS+crrtwnTbhZn2i7GHr\/PiTPv56bbq2H\/m22umWy\/OtF2abr041XJhqObUcM0pb2vNYMOFZe\/Y7Ru3nt54St0OCTUWzyFhfDOje0SiYjsiVCG+\/c3XfaPeiZ7uK6uroZ2sW9IBZffs1Vy\/jZ3g8R90CydP9viK2owxbSE2Q1emtFeJU65r3rtFhZVNTbFl7c5d6UJ6j0eonWWxKUK6oArfkg763S632zg0IqC4FMVwNSaguNyKYjw+49+HcZiF7mfNwqmeqTa89\/TkMkRIO0pvZ9fEcO\/kSN\/k6LiICumXfKkpH8Fg8Lnnbn\/jlVevXb3c1lRfdfzYicceqzx2tOLggaOPP3rwwQdOPv74yccfP\/XEE5VHjpw9dOTsoWOVR05UHT158eSZ88crlLNVNeeqmy7WNF5QOuqbBtu6JgeHlqamlyZnq0+e7u\/qE6rY2QnHPsll+Y0oUVVE1Z2tUDgcFapYnF34xsuvBl755tXNp2a8sxUHDx2+777jD31ZOfJE\/YlDsX8bTh5uPXu84eSh5tNHG08drjt+oPbEwdrjh+tOHGk5c7Kp4njzmcONFQdrTh5pPHe6vqp6cXZpxX95eyv2Sa5o2o8+Jz\/WFY3OjAyP9XTfvHY91vK3Tx4MydPaIrTMqxkrRmJR3RZ0PyQ2Ym9dbWRah7R+stWWzRGaOqT3fITJX5jlpgjpvDL2\/GTUR2TOPNmKlp02Qr+iYV\/GafE\/CdPfeEYhbfk3rbdfYUlIO8q1qzd\/9d4v1tZ8096B5YWJed\/I5NjAxFC\/d7DPO9jnGeidGOqfnRpfW56\/dfPqa6+89P03vvXuL376QfDdrc\/\/rIbvCRESIrq+vPTV52\/7Z2fX5xc25laXppaXppZnvQvTEwte79zMzJLPtzI7uzw97ff5VlZWrq+sXN\/cfCb2uHr5xs0bt77+8jdef+3bvd0DK\/NL3S3df\/Xfv\/A\/\/+IvLy\/Mfvx\/P4q1PVUhwhE1\/h1lUbETisSiWY3PEuFIPKx3tqOf39leW9ns6x4aGZyYGPet+DfGBj2jA2Nzs4u+mYXpSd+kd2Zmam5udn5x3u9fWJr3LczNzi\/MLc7Ozvlm5hZm5j3D41Me7+S4Z35mem5yenHG11DXPOX17X66OqqKcDQqEuPAIhFVqEKN7n7\/aFQINSrCO+Le3bHuTk9\/1\/zUlG9mTmT4RaHGVp2xt8w6pK07mvXdajZDOv266UNasyldQ9e8ZUO9sxXSezpCfUhLN0VI55G558e6j0jSoWQMaelrZtVDsiv+J6E9dyST9O8kDdltO6S171ctTxbt36Ct32LuENKO8qv3P\/jJz34a\/Pf3fvD3333lhVu+qeGu5truptrelvrBjua+1oaB9qbRvo7hnrZZz5DPOzw\/Obo0652fHJ2bGJmfHPXPeGa8o09fuzw9Onzh1Mn6qsqLpyqrK6rnJua27oaiEbETil\/ijqVXNCL7RhFVCCG2t0P\/+I8\/+PY3AsF33684evRCxbG2quMj7fWDbU3dTbVXVuZ\/\/Nb3f\/vB+5\/\/+U8ivBXd\/lyouz3eyd7vbRHdCt399M6fPrq5vtZQXXX6wIHzJ09cqqz+\/M93EnuMHU\/sivadz7b+8+PPPvzDn\/7w+z\/+\/g8f\/fZ3f\/jd7z\/8\/W\/\/8PN\/+cX160\/dvPF03YULJ5488NhfffHRL37hhRtXnru2dnXZt+GfXFvwzgz3e3o7hztahjtahtqbx3s6Jvq7l6c8i97RRe\/o8tTY5ox3bXJseWLk2tr8lc2rP\/rhj6MZfqNJ8sSX99Vm1JK2jE0bIZ1+XVshbdi01XLZtKT3dIT6kJYfOiGdN5JfbYrRB5JFLHuP03e2mDanO+d23zPqcltyTUbyJGQhbXzjZ5qu3cQ+JiUh7SiqEFdv3Nq8evPWjWdeuPXcS7e\/8vytmy8\/d+u1l1549YXb3\/r6y6+\/\/NIb33j1b1\/5+usvvfjaC8+\/9sLzt69evbWxcWtj45n19UWPZ6yvx9PXO9TRXn3s2JP33XfxTMWib\/bmU9ejInJv+278\/h3xQV5RNbQl9J9Ijn0qKRyO9x4vLyw++9Stkb6+rsaa\/sZqT8vFxYFWX2+9r7fe235xuLna21kzP9S66u1ZGutcm+hdHu1c8\/SsjHWtjHVdnu5dn+jYnOrZ8Hb7B9sue3onmpWWM8cWx4aFGhbRqLGffPfj2kKNxD7DHYmEopGQUKMiHJqd9t268czxxx878fADE231vs6Lvs7zky2V3uYqb9v5yY6Lky3VE81VnsZzsf+MNZwbrT871nBuvLHS01Q1UFs9UHt+qF6pqTh64czx1eW1LO62IQ3pgJKuJW3RMpENrbER0vbWNUZgqnE8iRWtFtQcv65lZGryyutlxkdoKPLSYyek80aSwSlfOVOk2QtpeQ+JaY+aEWCmjindX4epA0uEg9YAABJ9SURBVNtuS9o0HjR1d3ea314eENKOoqpqaEcVqvDNLl67enNt9fKSf\/3y5s2N9RurK1evX3v22tVbq8sbK0vrE57pkaHxnq7+lktNnfXtg+39fS09XQ0dfS09rUpzzdlLl05fWJyYn\/BM3rp1S+zePjLT4wntqM\/eev4rz724vLRecercwYcePX\/85OkDB84dOXTyiUdOPPLXA\/VVnvbakeaLoy2XZnoaPG2XRpqqY4\/R+rOj9WfHGyvHGyt7zx8bqqm4dLRipLXrV7\/419hXqGTkT3+6MzQ0M+P1DXX2nTtwuPvC2a4Lp7ovVrSeOxq7XF138mDdyYP1pw7VnjhQe+LAheMHzx87UH30yaojT5w79Nil46cunTp7qeJcXdWFhenZd372L1n8NozddfHi4lfShLS2KEnHUcuHYlmEtK11pXs3jreRtBekW9ZONlwT1Iz6thzdnfERWo\/ulr0\/KCHOqML2W9IWg\/\/shXTqV8\/YP6V7y5vm+ozsSaTr7rbb7bQfCGlHUVX1z\/8Z7wq++\/nON1\/79pXLN+Z8SwvzK3O+pbXVK1ev3FxZWt9Yu7K5fnVz\/eq1K09dXb16ff36tbVrl5cvb\/g3rq9f3\/BvbC5tbi5tTgxPTHqnhBB37tzJLqRj\/eHP3\/7qjevPLC6sLM0ur8wsL07Mj\/UOKWerjjzy8LnDh2tOn7548uShBx449dhjxx9++OSjjx66\/\/4jDzxw8olHTh98\/OKpYy0Xqxqrz\/a3NPhGvZuLy7FPNoejmcV0KCxUVfT1DM54p5enfCsTE8te79zw8Hhnp7e7e7K3d2ZoxDcyNj\/m8XsnlyamliZn\/RMzy1O+pcnZ+fHJjTn\/0rRvcXLGNzElwnwh6B5IOzuRCw6pwvKen9QhrelQshHSaXt3tCvGs1jz9ji5d902tNeWMx44lvYCy\/4hpB0lfvdlNfklYkKInZ0dwwJCiEhEDYejoVAkHI4mrq1qU3h3C7t3dM4qpIUQW1s7sd0JIURU\/PHDz3701k+vXX5memJh0jPnn19fnFvzz6\/Pz67MTvknxucnPQszk0uzU8sTkz6Pd2Z6ZmFkdOKlr7764Ucf7x55xhkZO\/JQKBR7jp9+cveNv\/m7vwl8\/\/azLz\/\/3Ne+9tI3A6+98d2\/\/Yfvfecf3\/npLz8I\/u7XH3wYvhdVd4S6ExtLl7zovr29HY5GwuEw392dJUI6bxxThY09P5Z9ILIOJTshLSw7bTRzdYM0tX1KsvGMhj1nFtLW4zKd8KdOSDuKqqrRqNA\/otFoOBoNaz5npQtj7deHRE1fv5Wfo0w+Ev8NR8TWdnRrS2xtiZ0dsbMj2Xsk\/iWh2YkKEY6PJ9\/dTqqvGLM85Lz9WsoEIZ03VGFIENKOkuJbSpLLyPLGvFh+hDXf5yUM3+oVUcOxR1REoiJ2jyv9Y09iX1oSp8Y\/eZV8GL5xzDBXm+uAM1GFIUFIO4qdlDWGdEGb0tHknZi1e4nf6ML8TeIWh76XXVtuRLdrw69Bl9AENRyJKgwJQtpRnB7SumDe\/Vdzb48UMamKXBxVfAtR46bTPXQJTUjDkajCkCCkHWgvvdaJYWJWc\/PfJQ4gG1RhSBDSAOAEVGFIENIA4ARUYUgQ0gDgBFRhSBDSAOAEVGFIENIA4ARUYUgQ0gDgBFRhSBDSAOAEVGFIpAxpJ94RBABKEiENiRyGtOnOYVnR3OZWcqdS2bLGe51Y3gs1zQ1ONLN5ZwKg0AhpSDirJa3L2NidTFMcRkBxuRXFMM90AzO7twpN7K407ycPwOEIaUjoQtrYloylmuaWoYmWp6zVabqLqGxFXXPWlITyW4FbhGvslnmmmYaItby3qbW0NyQHgJwjpCGhCWltd3WsWRkL1Pg0TdolG53aPDPEoWxF3f9lWahbUTvRHK67t7U1bUaX0sYd2ghpebc9w+sA5BX1BRLJkJZ08upTTXqzd80ilm3WxIrGPJXfPn63AZ6YJQtXzaZSpbRuD4Zr0qa8TrT8TXNcesYjBoA9o7JAQhfSsnatNKT1cZdRSBtYdisH\/W6XZjXJ2wddiOu2k1hB\/5wy6e42LWg8cKIaQE5RUyCRTUvaogvZXkjbH5GlG5WtXy1d2sdj2\/C+w\/buLS5Km3OaqAaQK1QTSGjCRn5NOnVIB5RMWtLphmQF\/e7k3OThSMeGmULZ9FEst9uqgW2xb+0bD+sFiWoA+UAdgYQuZpINVFk6atqlmnHbfiWDkBbGRrB84JhhnqHd7HZLMtTYDxBbJ3X7W79z6a7T\/96IagA5QQWBBAGzF0Q1gFyhdkCCaMkJ0hrAHlEyIEGi5BBRDSBrFAtIkCU5R1QDyAJlAhKkSJ4Q1QAyQoGABPmRV0Q1AJsoDZAgOQqAqAaQFkUBEmRGwRDVAFKgHECCtCgwohqAFIUAEuTEviCqARhQAiBBQuwjohpAAic\/JMgGJyCtAXDOQ4JIcA6iGihnnO2QIAychqgGyhPnOSSIAWciqoFywxkOCQLAyYhqoHxwbkOC0u98RDVQDjirIUHRLxZENVDaOJ8hQbkvLkQ1UKo4kyFBoS9GRDVQejiHIUGJL165ieqA4nK53P6g9RJBv9ulBPZwoPJ9ptkrUG6owpAgpEuA\/bQ25m3859QxnOuQDvrdbn9QiIAS32zQ79496ty+GQCKCVUYEoR0ybAT1Vnlbb5DOqDsNqkDCjGN8kUVhgQhXWJSRHWyvZroaZa2YY0TYyEd76LWd1JrFpWkq+WK8UmmNYJ+N33gKFtUYUgQ0iXJKqf1jeJkE1aTjgElGaexBWJJrJm9uwXt\/2X5armiBe2ugbJDFYYEIV3CzDlt2XOdmCHJUmOyx4PUGMuJGelWNEs0tunrRhmjCkOCkC55KUJa21vtSoS0rEFsEdIG2Ya07ngIapQpqjAkCOmyootNY291Fi3p1IGacUhzURrljCoMCUK6rOhCUJPHASXR1yy\/Ji3L2rSJai+kg3639q0CLWmUK6owJAjp8rLbRx2LS83Aa7+ia1Vru69TZK2+y9tmP7nVMck2AZQPqjAkCGkAcAKqMCQIaQBwAqowJAhpAHACqjAkCGkAcAKqMCQIaQBwAqowJAhpAHACqjAkCGkAcAKqMCQIaQBwAqowJAhpAHACqjAkCGkAcAKqMCTShXT6uygAAPaOkIZEbkNae3OG7CW+UVpykyb5stpZsps0JFY33l5RerCxbfIt0gAKiZCGhONa0rqMjd2FKcVhBBSXW1EM80x3W0xOsPF0djdJSAMoJEIaEsaQ1jQ1E01PJaC5W1IiuYxLCqGLR+sVdc1ZU2LK739oEa6xGyuZZhpS2nRUKX4fsQW4rTGAQiOkIaEPafm9hBPTdDcg3l1OG2iGOJStqPu\/LAx1K2onmsN19+aHps3oUtq4wxQhvTtbHtKMsAOQPxQXSOhC2tRPbOuWwJpFLNusiRWN8Se\/yfBuAzwxSxaumk2lSukU9z82bDK5E0lIa1czHm5RCyjpLsDn\/pJH\/PWlswLQKK3KghwxhrSsXSsNaX3cZRTSBpalOuh3uzSrSd4+6EJct53ECvrnlCJvtLPShHTx5rTx+cd\/Th3DuQ7poN\/t9geFCCguJaAbJ2h5EQQoA8VaVpBXWbakLbqQ7YW0\/RKsG5VtbvamSvt4zhred6TYvSQrzO8fij2qs8rbPIe0nuRvECgPxVdQUAD6vJFfk04d0gElk5a0xeXehN0Cbjgc6dgwUyibGolut1UDO7VUB1m8Oa19W6N5NUytV\/uDB1OPAbReMT5Jvgad4ChTxVRNUDDmsHHrSqpld7em9PqVDEJaGBvB8oFjhnmGdrPbbf4stKkNFlsndfvbIhDSZIXLxGpJpzG+KpLRf\/YHD2Y2BtBOE5lmNMpZ0dQRFFLRxYxzFGNOW\/YkaK\/h27zkkX4MoI1RhzpkNMpacRQRFFhxZYzTFF1OG0JaMvrP\/uDB9GMAMwtpurpR5oqggqDwiihgHKuIoloXm9LRf5m1pFO3ezMKaZrRKHeOrh3YL0URLc5XLDmta63KR\/\/ZHjyYvumbQUjLvnEdKC\/OLRzYR87PlWJRHDm920edHKQf\/zE5+k\/Tj51m8KCdMYD2Qjo3d2YBippTqwb2ldNDpdgUR1QDcB7qBSSIk5wjpwFkgWIBCbIkH1wm+31EAJyOMgEJUiR\/yGkA9lEjIEGE5BU5DcAmCgQkyI8CIKoBpEVpgATJURjkNIDUqAuQIDYKhpwGkAJFARJkRoER1QCkKAeQIC0Kj5wGYEYtgARRsS9cJvt9RAD2GVUAEoTEPiKnASRQAiBBQuwvchpADOc\/JIgHJyCqAXDmQ4JgcAhyGihznPaQIBWcg9FkQDnjhIcEeeA05DRQnjjbIUEYOBA5DZQhTnVIkATORNc3UG44ySFBBjgZOQ2UD85wSBAADkdOA2WC0xsSVP+iQFQDJY8TGxLU\/WJBTgOljbMaEhT9IsJoMqCEcT5DgnJfdMhpoCRxMkOCWl+MyGmg9HAmQ4JCX7yIaqCUcA5DghJf1MhpoGRwAkOC+l7syGmgNHD2QoLiXhqIaqDYcd5CgrJeMrLM6YDicrnc\/qD1EkG\/26UEcnGIun2m2StQbqjCkCCkS4nLxLCAMW\/jP6eO4VyHdNDvdvuDQgQU3WZjyU1wo2xRhSFBSJeeFDmdVd4WJKQDisutKG5CGuWLKgwJQrokSXPa705OiWdhMDktmZfGibGQjndR69u6mkUlOW65YnySfpdKIOgnpFHGqMKQIKRLmDmq9Y3igLIbiZp4DCjJOI0tEEtizezdLWj\/LwtYyxUNdo+KkEZZowpDgpAubSlDWiMxQ5KlxmSPB6kxUhMz0q1otWtCGuWNKgwJQrrkpQhpbW+1KxHSsgaxRUgbZBHS2mUIaZQ1qjAkCOmyootNY291Fi3p1OPJ7IR04oq1ddYD5YEqDAlCuqzo2qqaPA4oiXFc8mvSsqxN2\/C1191tcXRAuaEKQ4KQLi+7fdSxLNQMvPYrula1tkmbImv1Xd42+8lTHhwhjbJFFYYEIQ0ATkAVhgQhDQBOQBWGBCENAE5AFYYEIQ0ATkAVhgQhDQBOQBWGBCENAE5AFYYEIQ0ATkAVhgQhDQBOQBWGBCENAE5AFQYAwKEIaQAAHIqQBgDAoQjpgpLc8Q8a2t+P\/nclv8sCv08ApY2QLqgiDZX09wjOEeuQlh9Fkf4+AcAmQrqgijRUnBHSaZYHgNJDSBeULlQ0d93V3rNXCWju55vo37VY2DhNBP1utz+Y2IISSC6m7S22Wte8d929gfUdzoZ9pT7agBK7PXFimmSZNN3dpsVtLYNsBBTTy22Q+3du8b8k7h0NaBDSBaUJlYCyW4w0l1tjMRP\/QbdwsnbFV9Tmk2kLsRnx0Er+kNxEinXNe7eqx7rlg3737grSpxarwJo4lixjGdIWB2xrGaRlfH3jP6eO4VyHdOwtnxABRftXL313CJQRQrqg5N2zyXKnL3wBJV6czKsZUyixqG4Luh8SG7G3bnJyypDWTNasIFnEumdasxl56FoesK1lkFZWeZvvkDb8\/fFqokwR0gVlbO25DN2z1iFtqFH6lQ290zZCOv26WYW0vgmve2rGkJYtkyKkpQdsaxmkJrmcIbsSYZpofWkmzXUHyxUDmoshpr9dXk2UKUK6oJKhIu9NzqglLW3G2Azp9Otm35KWPzX9c7DoTLcOaXmbzc4ySMv4wltcrdBfcLG8OJLuuoPligYBxZUYVEFEo2wR0gUlDendYiSsY1JeImWVy0ZI21vXRnej6Zq06S2F5qlZhrRmGatab1mm7SyDtNK\/bZNkqcVfS\/rrDpZ\/ZmYMJQMI6YIyhlC8BPmVNCGt7UGUTDL0VKYLaVvrSvduGt2t7bfUR7DxqRnLvGwZm6O7tW9Y0i+DtAwhLbkSIYnSFCFtkF1IGy5l8HKiTBHSyBpdzCXC8s1cli3p1H8UtkJa3yCnmwTli5BG1gjpEqHLQOurFeYLLrKsTRuo9lrSpjGW\/KWhPBHSyBohXSr0lzOkVyJMF1xSZG3q6w52r0lrPiZNMxrli5AGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMChCGkAAByKkAYAwKEIaQAAHIqQBgDAoQhpAAAcipAGAMCh\/j+FJGGFYAlkKgAAAABJRU5ErkJggg==\" alt=\"\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Dans le vocabulaire oracle une t\u00e2che correspond \u00e0 un programme qui pour nous correspond \u00e0 une commande de calcul de statistiques pour une seule table. Chaque \u00e9tape ou step de chaque chaine slave lance un programme et donc un calcul de statistique pour une table.<\/p>\n<p>Le d\u00e9but de la proc\u00e9dure se charge de cr\u00e9er le jeu de chaine complet (maitre\/esclave):<\/p>\n<pre name=\"code\" class=\"sql\">\r\n(...)\r\n   \/* Debut phase de cr\u00e9ation des chaines maitres\/esclaves *\/\r\n   \/* debut cr\u00e9ation de la chaine maitre *\/\r\n   SYS.DBMS_SCHEDULER.CREATE_CHAIN (chain_name            =&gt; 'MASTER_CHAIN',\r\n                                    rule_set_name         =&gt; NULL,\r\n                                    evaluation_interval   =&gt; NULL,\r\n                                    comments              =&gt; NULL);\r\n   SYS.DBMS_SCHEDULER.ENABLE (name =&gt; 'MASTER_CHAIN');\r\n\r\n   \/* fin cr\u00e9ation de la chaine maitre *\/\r\n\r\n   FOR I IN 1 .. P_FACTOR\r\n   LOOP\r\n      v_chain_start := v_chain_start || 'SLAVE_CHAIN_' || I || ',';\r\n      v_chain_stop := v_chain_stop || 'SLAVE_CHAIN_' || I || ' COMPLETED AND ';\r\n\r\n      \/* debut creation des chaines esclaves qui seront lanc\u00e9es en parall\u00e9le par la chain maitre *\/\r\n      SYS.DBMS_SCHEDULER.CREATE_CHAIN (chain_name            =&gt; 'SLAVE_CHAIN_' || I,\r\n                                       rule_set_name         =&gt; NULL,\r\n                                       evaluation_interval   =&gt; NULL,\r\n                                       comments              =&gt; NULL);\r\n      SYS.DBMS_SCHEDULER.ENABLE (name =&gt; 'SLAVE_CHAIN_' || I);\r\n      \/* pour chaque chaine slave un step dans la chaine master correspondant doit \u00eatre cr\u00e9\u00e9 *\/\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'MASTER_CHAIN',\r\n         step_name      =&gt; 'SLAVE_CHAIN_' || I,\r\n         program_name   =&gt; 'SLAVE_CHAIN_' || I);\r\n   END LOOP;\r\n\r\n (...)\r\n<\/pre>\n<p>La variable P_FACTOR correspond \u00e0 la valeur pass\u00e9e en param\u00e8tre de la proc\u00e9dure qui d\u00e9termine le nombre de threads de chaines esclaves qui seront cr\u00e9\u00e9s. Dans la boucle chaque chaine esclave est d\u00e9finie comme une \u00e9tape de la chaine maitre. il s&#8217;agit de nested chain ou chaines imbriqu\u00e9es. c&#8217;est la commande DBMS_SCHEDULER.CREATE_CHAIN qui est utilis\u00e9e pour \u00e7a.<\/p>\n<p>Une chaine oracle doit comporter des \u00e9tapes mais aussi des r\u00e8gles de d\u00e9clenchement, par d\u00e9faut si aucune r\u00e8gle n&#8217;existe aucun step n&#8217;est lanc\u00e9, m\u00eame s&#8217;ils sont d\u00e9j\u00e0 pr\u00e9sents dans la chaine.<\/p>\n<p>Pour d\u00e9finir ces r\u00e8gles on utilise DBMS_SCHEDULER.DEFINE_CHAIN_RULE<\/p>\n<pre name=\"code\" class=\"sql\"> \r\n (...)\r\n\r\n  \/* fin creation des chaines esclaves qui seront lanc\u00e9es en parall\u00e9le par la chain maitre *\/\r\n\r\n   \/* la ligne ci-dessous sert a cr\u00e9er la r\u00e8gle qui permet de lancer tous les process esclaves en parall\u00e8le *\/\r\n   DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('MASTER_CHAIN',\r\n                                     'TRUE',\r\n                                     TRIM (TRAILING ',' FROM v_chain_start));\r\n\r\n   DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n      'MASTER_CHAIN',\r\n      SUBSTR (v_chain_stop, 1, LENGTH (v_chain_stop) - 5),\r\n      'END');\r\n\r\n(...)\r\n<\/pre>\n<p>Ind\u00e9pendamment des relations qui peuvent exister entre chaque step, la chaine doit avoir une condition qui se v\u00e9rifie tout le temps pour permettre \u00e0  au moins une premi\u00e8re \u00e9tape de se d\u00e9clencher lorsqu&#8217;aucun step de d\u00e9part n&#8217;est indiqu\u00e9 dans la commande de lancement. Elle doit \u00e9galement comporter une condition de sortie, de pr\u00e9f\u00e9rence une condition qui a 100% de chance de se produire. Dans le cas ci-dessus m\u00eame si on ne voit pas tr\u00e8s bien a quoi correspondent les variable v_chain_start &amp; v_chain_stop ( je compose l&#8217;action \u00e0 la vol\u00e9e car il d\u00e9pend de P_FACTOR qui n&#8217;est pas fixe) j&#8217;indique \u00e0 Oracle: &#8220;Lorsque TRUE renvoit vrai (tout le temps \u00e0 priori) tu d\u00e9marres toutes les chaines esclaves, et lorsqu&#8217;elles sont toutes completed la chaine maitre se termine&#8221;<\/p>\n<p>A ce stade, nous devons cr\u00e9er un programme par table et les affecter en tant que step \u00e0  chaque chaine esclave:<\/p>\n<pre name=\"code\" class=\"sql\"> \r\nFOR table_courante\r\n      IN (  SELECT table_name, owner\r\n              FROM dba_tables\r\n             WHERE     owner LIKE utilisateur\r\n                   AND NOT REGEXP_LIKE (table_name, '^TMP_[0-9]+$')\r\n                   AND table_name NOT LIKE 'TMP\\_%\\__\\_________' ESCAPE '\\'\r\n                   AND table_name NOT LIKE '%TEST%'\r\n                   AND table_name NOT LIKE 'BIN$%'\r\n                   AND OWNER NOT IN\r\n                          ('SYS',\r\n                           'SYSTEM',\r\n                           'TSMSYS',\r\n                           'ORACLE_OCM',\r\n                           'DIP',\r\n                           'DBSNMP',\r\n                           'DBSNMP',\r\n                           'OUTLN',\r\n                           'WMSYS')\r\n          ORDER BY BLOCKS DESC NULLS LAST)\r\n   LOOP\r\n      SYS.DBMS_SCHEDULER.CREATE_PROGRAM (\r\n         program_name          =&gt; 'SYS.PRG_PARA_' || v_cpt_prg,\r\n         program_type          =&gt; 'PLSQL_BLOCK',\r\n         program_action        =&gt; 'BEGIN \r\n                                dbms_stats.gather_table_stats(\r\n                                    ownname=&gt;'\r\n                                 || DBMS_ASSERT.enquote_literal (\r\n                                       table_courante.owner)\r\n                                 || ',\r\n                                    tabname=&gt;'\r\n                                 || DBMS_ASSERT.enquote_literal (\r\n                                       table_courante.table_name)\r\n                                 || ',\r\n                                    granularity=&gt;''ALL'',\r\n                                    estimate_percent=&gt;DBMS_STATS.AUTO_SAMPLE_SIZE,\r\n                                    cascade=&gt;TRUE,\r\n                                    degree=&gt;DBMS_STATS.AUTO_DEGREE);\r\n                                END;',\r\n         number_of_arguments   =&gt; 0,\r\n         enabled               =&gt; TRUE,\r\n         comments              =&gt; NULL);\r\n\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'SLAVE_CHAIN_' || v_curr_slave_chain,\r\n         step_name      =&gt; 'STEP_PARA_' || v_cpt_prg,\r\n         program_name   =&gt; 'SYS.PRG_PARA_' || v_cpt_prg);\r\n\r\n      \/* debut ajout du prog courant en tant que step du process slave courant *\/\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'SLAVE_CHAIN_' || v_curr_slave_chain,\r\n         step_name      =&gt; 'STEP_PARA_' || v_cpt_prg,\r\n         program_name   =&gt; 'SYS.PRG_PARA_' || v_cpt_prg);\r\n      \/* fin ajout du prog courant en tant que step du process slave courant *\/\r\n\r\n      \/* v_curr_slave_chain  :cette variable me sert \u00e0 me positionner sur la chaine esclave suivante *\/\r\n      v_curr_slave_chain := v_curr_slave_chain + 1;\r\n      v_cpt_prg := v_cpt_prg + 1;\r\n\r\n      IF v_curr_slave_chain &gt; P_FACTOR\r\n      THEN\r\n         v_curr_slave_chain := 1;\r\n      END IF;\r\n   END LOOP;\r\n\r\n   \/* fin de la distribution des t\u00e2ches entre les process slave *\/\r\n<\/pre>\n<p>Dans cette partie les programmes correspondent \u00e0 des calcul de statistiques mais il pourrait s&#8217;agir de tout autre chose. Chaque step est affect\u00e9 \u00e0 une chaine de mani\u00e8re circulaire ajout\u00e9 \u00e0 l&#8217;order by BLOCK de la requ\u00eate se s\u00e9lection des tables ceci permet de ne pas affecter les tables les plus lourdes \u00e0 une seule et m\u00eame chaine esclave qui pourrait finir bien apr\u00e8s les autres et limiter l\u2019int\u00e9r\u00eat de parall\u00e9liser.<\/p>\n<p>Comme on a vu pr\u00e9c\u00e9demment une chaine a besoin d&#8217;\u00e9tapes et de conditions. Pour cr\u00e9er ces conditions on utilise deux boucles imbriqu\u00e9es:<\/p>\n<pre name=\"code\" class=\"sql\"> \r\n  FOR CHAINE_COURANTE\r\n      IN (  SELECT CHAIN_NAME,\r\n                   MAX (step_name) \"STARTING_STEP\",\r\n                   MIN (step_name) \"ENDING_STEP\"\r\n              FROM DBA_SCHEDULER_CHAIN_STEPS\r\n             WHERE CHAIN_NAME LIKE 'SLAVE_CHAIN%'\r\n          GROUP BY chain_name)\r\n   LOOP\r\n      DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n         CHAINE_COURANTE.CHAIN_NAME,\r\n         'TRUE',\r\n         'START ' || CHAINE_COURANTE.STARTING_STEP); --je positionne mon step de depart\r\n      DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n         CHAINE_COURANTE.CHAIN_NAME,\r\n         CHAINE_COURANTE.ENDING_STEP || ' COMPLETED',\r\n         'END');                              -- je positionne mon step de fin\r\n      v_last_step := CHAINE_COURANTE.STARTING_STEP; --cette variable mer sert a connaitre le dernier step ex\u00e9cut\u00e9 donc le step de d\u00e9marrage a ce stade la procedure\r\n\r\n      FOR STEP_COURANT\r\n         IN (  SELECT STEP_NAME\r\n                 FROM DBA_SCHEDULER_CHAIN_STEPS\r\n                WHERE CHAIN_NAME = CHAINE_COURANTE.CHAIN_NAME\r\n                      AND STEP_NAME &lt;&gt; CHAINE_COURANTE.STARTING_STEP\r\n             ORDER BY REPLACE (step_name, '_', 'Z') DESC)\r\n      LOOP\r\n         \/* ici on balaye l'ensemble des steps de la chain en cours en triant le nom par ordre decroissant ce qui nous fera finir par le step de fin, j'exclue le step de d\u00e9marrage\r\n         car celui-ci a d\u00e9j\u00e0 \u00e9t\u00e9 manuellement positionn\u00e9 ci-dessus*\/\r\n\r\n         --DBMS_OUTPUT.PUT_LINE('chaine: '||CHAINE_COURANTE.CHAIN_NAME||', STEP: '||STEP_COURANT.STEP_NAME); --affichage de controle oseb\r\n         DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n            CHAINE_COURANTE.CHAIN_NAME,\r\n            v_last_step || ' COMPLETED',\r\n            'START ' || STEP_COURANT.STEP_NAME);\r\n\r\n         \/*cette regle me permet d'indiquer \u00e0 oracle que le dernier step compl\u00e9t\u00e9 lance le step courant dans la boucle qui devient alors le dernier step lanc\u00e9 et ainsi de suite jusqu'au dernier*\/\r\n\r\n         v_last_step := STEP_COURANT.STEP_NAME;\r\n      END LOOP;\r\n   END LOOP;\r\n\/* FIN phase de cr\u00e9ation des chaines maitres\/esclaves *\/\r\n<\/pre>\n<p>Une fois ces r\u00e8gles d\u00e9finies il ne reste plus qu&#8217;\u00e0 lancer la chaine maitre qui lancera en cascade toutes les chaines esclaves et  avec le syst\u00e8me pouss\u00e9 de logging du scheduler oracle nous allons pouvoir connaitre quel temps on a mis pour chaque table individuellement.<\/p>\n<p>Comme avec le parall\u00e9lisme classique il faut \u00eatre tr\u00e8s vigilant sur la consommation cpu que cela peut engendrer, donc ne pas exag\u00e9rer le nombre de thread cr\u00e9\u00e9s&#8230;<\/p>\n<p>Pour ceux qui souhaitent faire le test voici le code complet de la proc\u00e9dure:<\/p>\n<p>&nbsp;<\/p>\n<pre name=\"code\" class=\"sql\"> \r\nCREATE OR REPLACE PROCEDURE SYS.CALCUL_STATS_PARALLEL (\r\n   P_FACTOR       NUMBER,\r\n   Utilisateur    VARCHAR2 DEFAULT '%')\r\nIS\r\n   v_code               NUMBER;\r\n   v_errm               VARCHAR2 (64);\r\n   v_chain_start        VARCHAR2 (30000) := 'START ';\r\n   v_chain_stop         VARCHAR2 (30000) := NULL;\r\n   v_curr_slave_chain   NUMBER := 1;\r\n   v_last_step          VARCHAR2 (30);\r\n   v_cpt_prg            NUMBER (5) := 0;\r\n   CLEAN                VARCHAR2 (32);\r\n   cpt                  NUMBER (10) := 1;\r\nBEGIN\r\n   \/*********************************************************************************************\/\r\n   \/* C@pdata LE 17 mai 2016\r\n   \/********************************************************************************************\/\r\n\r\n   \/* Debut phase de cr\u00e9ation des chaines maitres\/esclaves *\/\r\n   \/* debut cr\u00e9ation de la chaine maitre *\/\r\n   SYS.DBMS_SCHEDULER.CREATE_CHAIN (chain_name            =&gt; 'MASTER_CHAIN',\r\n                                    rule_set_name         =&gt; NULL,\r\n                                    evaluation_interval   =&gt; NULL,\r\n                                    comments              =&gt; NULL);\r\n   SYS.DBMS_SCHEDULER.ENABLE (name =&gt; 'MASTER_CHAIN');\r\n\r\n   \/* fin cr\u00e9ation de la chaine maitre *\/\r\n\r\n   FOR I IN 1 .. P_FACTOR\r\n   LOOP\r\n      v_chain_start := v_chain_start || 'SLAVE_CHAIN_' || I || ',';\r\n      v_chain_stop := v_chain_stop || 'SLAVE_CHAIN_' || I || ' COMPLETED AND ';\r\n\r\n      \/* debut creation des chaines esclaves qui seront lanc\u00e9es en parall\u00e9le par la chain maitre *\/\r\n      SYS.DBMS_SCHEDULER.CREATE_CHAIN (chain_name            =&gt; 'SLAVE_CHAIN_' || I,\r\n                                       rule_set_name         =&gt; NULL,\r\n                                       evaluation_interval   =&gt; NULL,\r\n                                       comments              =&gt; NULL);\r\n      SYS.DBMS_SCHEDULER.ENABLE (name =&gt; 'SLAVE_CHAIN_' || I);\r\n      \/* pour chaque chaine slave un step dans la chaine master correspondant doit \u00eatre cr\u00e9\u00e9 *\/\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'MASTER_CHAIN',\r\n         step_name      =&gt; 'SLAVE_CHAIN_' || I,\r\n         program_name   =&gt; 'SLAVE_CHAIN_' || I);\r\n   END LOOP;\r\n\r\n   \/* fin creation des chaines esclaves qui seront lanc\u00e9es en parall\u00e9le par la chain maitre *\/\r\n\r\n   \/* la ligne ci-dessous sert a cr\u00e9er la r\u00e8gle qui permet de lancer tous les process esclaves en parall\u00e8le *\/\r\n   DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('MASTER_CHAIN',\r\n                                     'TRUE',\r\n                                     TRIM (TRAILING ',' FROM v_chain_start)); \/* le trim sert a retirer la derniere virgule qui casse les c.. a la fin de la variable v_chain_start *\/\r\n   \/* la ligne ci-dessous sert \u00e0 cr\u00e9er la regle de fin d'ex\u00e9cution de la chaine maitre on remanipule un peu la cha\u00eene au passage *\/\r\n\r\n   DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n      'MASTER_CHAIN',\r\n      SUBSTR (v_chain_stop, 1, LENGTH (v_chain_stop) - 5),\r\n      'END');\r\n\r\n   --dbms_output.put_line('chaine: '||substr(v_chain_stop,1,length(v_chain_stop)-5));\r\n   \/* debut de la distribution des t\u00e2ches entre les process slave *\/\r\n\r\n   FOR table_courante\r\n      IN (  SELECT table_name, owner\r\n              FROM dba_tables\r\n             WHERE     owner LIKE utilisateur\r\n                   AND NOT REGEXP_LIKE (table_name, '^TMP_[0-9]+$')\r\n                   AND table_name NOT LIKE 'TMP\\_%\\__\\_________' ESCAPE '\\'\r\n                   AND table_name NOT LIKE '%TEST%'\r\n                   AND table_name NOT LIKE 'BIN$%'\r\n                   AND OWNER NOT IN\r\n                          ('SYS',\r\n                           'SYSTEM',\r\n                           'TSMSYS',\r\n                           'ORACLE_OCM',\r\n                           'DIP',\r\n                           'DBSNMP',\r\n                           'DBSNMP',\r\n                           'OUTLN',\r\n                           'WMSYS')\r\n          ORDER BY BLOCKS DESC NULLS LAST)\r\n   LOOP\r\n      SYS.DBMS_SCHEDULER.CREATE_PROGRAM (\r\n         program_name          =&gt; 'SYS.PRG_PARA_' || v_cpt_prg,\r\n         program_type          =&gt; 'PLSQL_BLOCK',\r\n         program_action        =&gt; 'BEGIN \r\n                                dbms_stats.gather_table_stats(\r\n                                    ownname=&gt;'\r\n                                 || DBMS_ASSERT.enquote_literal (\r\n                                       table_courante.owner)\r\n                                 || ',\r\n                                    tabname=&gt;'\r\n                                 || DBMS_ASSERT.enquote_literal (\r\n                                       table_courante.table_name)\r\n                                 || ',\r\n                                    granularity=&gt;''ALL'',\r\n                                    estimate_percent=&gt;DBMS_STATS.AUTO_SAMPLE_SIZE,\r\n                                    cascade=&gt;TRUE,\r\n                                    degree=&gt;DBMS_STATS.AUTO_DEGREE);\r\n                                END;',\r\n         number_of_arguments   =&gt; 0,\r\n         enabled               =&gt; TRUE,\r\n         comments              =&gt; NULL);\r\n\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'SLAVE_CHAIN_' || v_curr_slave_chain,\r\n         step_name      =&gt; 'STEP_PARA_' || v_cpt_prg,\r\n         program_name   =&gt; 'SYS.PRG_PARA_' || v_cpt_prg);\r\n\r\n      \/* debut ajout du prog courant en tant que step du process slave courant *\/\r\n      SYS.DBMS_SCHEDULER.DEFINE_CHAIN_STEP (\r\n         chain_name     =&gt; 'SLAVE_CHAIN_' || v_curr_slave_chain,\r\n         step_name      =&gt; 'STEP_PARA_' || v_cpt_prg,\r\n         program_name   =&gt; 'SYS.PRG_PARA_' || v_cpt_prg);\r\n      \/* fin ajout du prog courant en tant que step du process slave courant *\/\r\n\r\n      \/* v_curr_slave_chain  :cette variable me sert \u00e0 me positionner sur la chaine esclave suivante *\/\r\n      v_curr_slave_chain := v_curr_slave_chain + 1;\r\n      v_cpt_prg := v_cpt_prg + 1;\r\n\r\n      IF v_curr_slave_chain &gt; P_FACTOR\r\n      THEN\r\n         v_curr_slave_chain := 1;\r\n      END IF;\r\n   END LOOP;\r\n\r\n   \/* fin de la distribution des t\u00e2ches entre les process slave *\/\r\n\r\n   FOR CHAINE_COURANTE\r\n      IN (  SELECT CHAIN_NAME,\r\n                   MAX (step_name) \"STARTING_STEP\",\r\n                   MIN (step_name) \"ENDING_STEP\"\r\n              FROM DBA_SCHEDULER_CHAIN_STEPS\r\n             WHERE CHAIN_NAME LIKE 'SLAVE_CHAIN%'\r\n          GROUP BY chain_name)\r\n   LOOP\r\n      DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n         CHAINE_COURANTE.CHAIN_NAME,\r\n         'TRUE',\r\n         'START ' || CHAINE_COURANTE.STARTING_STEP); --je positionne mon step de depart\r\n      DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n         CHAINE_COURANTE.CHAIN_NAME,\r\n         CHAINE_COURANTE.ENDING_STEP || ' COMPLETED',\r\n         'END');                              -- je positionne mon step de fin\r\n      v_last_step := CHAINE_COURANTE.STARTING_STEP; --cette variable mer sert a connaitre le dernier step ex\u00e9cut\u00e9 donc le step de d\u00e9marrage a ce stade la procedure\r\n\r\n      FOR STEP_COURANT\r\n         IN (  SELECT STEP_NAME\r\n                 FROM DBA_SCHEDULER_CHAIN_STEPS\r\n                WHERE CHAIN_NAME = CHAINE_COURANTE.CHAIN_NAME\r\n                      AND STEP_NAME &lt;&gt; CHAINE_COURANTE.STARTING_STEP\r\n             ORDER BY REPLACE (step_name, '_', 'Z') DESC)\r\n      LOOP\r\n         \/* ici on balaye l'ensemble des steps de la chain en cours en triant le nom par ordre decroissant ce qui nous fera finir par le step de fin, j'exclue le step de d\u00e9marrage\r\n         car celui-ci a d\u00e9j\u00e0 \u00e9t\u00e9 manuellement positionn\u00e9 ci-dessus*\/\r\n\r\n         --DBMS_OUTPUT.PUT_LINE('chaine: '||CHAINE_COURANTE.CHAIN_NAME||', STEP: '||STEP_COURANT.STEP_NAME); --affichage de controle oseb\r\n         DBMS_SCHEDULER.DEFINE_CHAIN_RULE (\r\n            CHAINE_COURANTE.CHAIN_NAME,\r\n            v_last_step || ' COMPLETED',\r\n            'START ' || STEP_COURANT.STEP_NAME);\r\n\r\n         \/*cette regle me permet d'indiquer \u00e0 oracle que le dernier step compl\u00e9t\u00e9 lance le step courant dans la boucle qui devient alors le dernier step lanc\u00e9 et ainsi de suite jusqu'au dernier*\/\r\n\r\n         v_last_step := STEP_COURANT.STEP_NAME;\r\n      END LOOP;\r\n   END LOOP;\r\n\/* FIN phase de cr\u00e9ation des chaines maitres\/esclaves *\/\r\n\r\n\/* Debut phase de lancement et monitoring *\/\r\nDBMS_SCHEDULER.RUN_CHAIN\r\n   (\r\n    chain_name =&gt; 'SYS.MASTER_CHAIN'\r\n    ,start_steps =&gt; null\r\n   );--lancement de la chaine maitre\r\n\r\nWHILE cpt &lt;&gt; 0\r\n   LOOP\r\n      SELECT COUNT (*)\r\n        INTO cpt\r\n        FROM dba_scheduler_running_chains\r\n       WHERE chain_name = 'MASTER_CHAIN';\r\n       DBMS_LOCK.SLEEP (30);\r\n   END LOOP;\r\n\r\n\/* FIN phase de lancement et monitoring *\/\r\n\r\n\/* DEBUT nettoyage des chaines *\/\r\n\r\nFOR CLEAN in (\r\nSELECT   chain_name\r\n  FROM SYS.DBA_SCHEDULER_CHAINS\r\nWHERE chain_name LIKE 'MASTER_%' OR chain_name LIKE 'SLAVE_%'\r\n                    ) LOOP\r\ndbms_scheduler.drop_chain(CLEAN.CHAIN_NAME,force  =&gt; TRUE);\r\nEND LOOP;\r\n\/* FIN nettoyage des chaines *\/\r\n\/* DEBUT nettoyage des programmes *\/\r\nFOR CLEAN in (\r\nSELECT  P.PROGRAM_NAME\r\n  FROM SYS.DBA_OBJECTS O, SYS.DBA_SCHEDULER_PROGRAMS P\r\n WHERE     O.OWNER = P.OWNER\r\n       AND O.OBJECT_NAME = P.PROGRAM_NAME\r\n       AND O.OBJECT_TYPE = 'PROGRAM'\r\n       AND O.OWNER = 'SYS'\r\n       AND PROGRAM_TYPE = 'PLSQL_BLOCK'\r\n       AND PROGRAM_NAME LIKE 'PRG_PARA_%') LOOP\r\nDBMS_SCHEDULER.DROP_PROGRAM(CLEAN.PROGRAM_NAME);\r\nEND LOOP;\r\n\/* FIN nettoyage des programmes *\/\r\n\r\nEXCEPTION\r\n   WHEN OTHERS\r\n   THEN\r\n      v_code := SQLCODE;\r\n      v_errm := SUBSTR (SQLERRM, 1, 64);\r\n      DBMS_OUTPUT.PUT_LINE (\r\n         'Sortie de la procedure en erreur: ORA-' || v_code || '- ' || v_errm);\r\nEND;\r\n\/\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>N&#8217;h\u00e9sitez pas \u00e0 nous faire des retours \ud83d\ude09<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011&#038;title=Les%20Chaines%20Oracle\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Les%20Chaines%20Oracle&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6011\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Hello amis dba&#8217;s et bienvenue sur cet article ! Au menu aujourd&#8217;hui un cas concret d&#8217;utilisation d&#8217;un sujet assez peu abord\u00e9 et pourtant bien utile: les chaines Oracle. Les chaines sont un composant du planificateur Oracle qui permet de g\u00e9rer&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":7814,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-6011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Les Chaines Oracle - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Les Chaines Oracle - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Hello amis dba&#8217;s et bienvenue sur cet article ! Au menu aujourd&#8217;hui un cas concret d&#8217;utilisation d&#8217;un sujet assez peu abord\u00e9 et pourtant bien utile: les chaines Oracle. Les chaines sont un composant du planificateur Oracle qui permet de g\u00e9rer&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-15T10:23:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-13T12:01:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2016\/06\/chaines.png\" \/>\n\t<meta property=\"og:image:width\" content=\"652\" \/>\n\t<meta property=\"og:image:height\" content=\"363\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Capdata team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Capdata team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\"},\"author\":{\"name\":\"Capdata team\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\"},\"headline\":\"Les Chaines Oracle\",\"datePublished\":\"2016-06-15T10:23:52+00:00\",\"dateModified\":\"2019-09-13T12:01:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\"},\"wordCount\":934,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"articleSection\":[\"Oracle\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\",\"name\":\"Les Chaines Oracle - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2016-06-15T10:23:52+00:00\",\"dateModified\":\"2019-09-13T12:01:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Les Chaines Oracle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\",\"name\":\"Capdata team\",\"sameAs\":[\"https:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Les Chaines Oracle - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/","og_locale":"fr_FR","og_type":"article","og_title":"Les Chaines Oracle - Capdata TECH BLOG","og_description":"Hello amis dba&#8217;s et bienvenue sur cet article ! Au menu aujourd&#8217;hui un cas concret d&#8217;utilisation d&#8217;un sujet assez peu abord\u00e9 et pourtant bien utile: les chaines Oracle. Les chaines sont un composant du planificateur Oracle qui permet de g\u00e9rer&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2016-06-15T10:23:52+00:00","article_modified_time":"2019-09-13T12:01:31+00:00","og_image":[{"width":652,"height":363,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2016\/06\/chaines.png","type":"image\/png"}],"author":"Capdata team","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Capdata team","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/"},"author":{"name":"Capdata team","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9"},"headline":"Les Chaines Oracle","datePublished":"2016-06-15T10:23:52+00:00","dateModified":"2019-09-13T12:01:31+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/"},"wordCount":934,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"articleSection":["Oracle"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/","url":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/","name":"Les Chaines Oracle - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2016-06-15T10:23:52+00:00","dateModified":"2019-09-13T12:01:31+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/chainesoracle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Les Chaines Oracle"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9","name":"Capdata team","sameAs":["https:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=6011"}],"version-history":[{"count":22,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6011\/revisions"}],"predecessor-version":[{"id":6126,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6011\/revisions\/6126"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/7814"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=6011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=6011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=6011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}