Changeset 792
- Timestamp:
- 11/18/07 16:46:46 (1 year ago)
- Files:
-
- traduc/branches/bv81x/manuel/plpgsql.xml (modified) (68 diffs)
- traduc/branches/bv82x/manuel/plpgsql.xml (modified) (80 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
traduc/branches/bv81x/manuel/plpgsql.xml
r727 r792 20 20 <listitem> 21 21 <para> 22 est utilisé pour créer des procédures fonctions et déclencheurs,22 est utilisé pour créer des fonctions standards et triggers, 23 23 </para> 24 24 </listitem> … … 30 30 <listitem> 31 31 <para> 32 pe uteffectuer des traitements complexes,32 permet d'effectuer des traitements complexes, 33 33 </para> 34 34 </listitem> … … 41 41 <listitem> 42 42 <para> 43 peut êtredéfini comme digne de confiance par le serveur,43 est défini comme digne de confiance par le serveur, 44 44 </para> 45 45 </listitem> … … 203 203 <para> 204 204 Les fonctions écrites en <application>PL/pgSQL</application> peuvent accepter 205 commeargument n'importe quel type de données supporté par le serveur, et205 en argument n'importe quel type de données supporté par le serveur, et 206 206 peuvent renvoyer un résultat de n'importe lequel de ces types. Elles peuvent 207 207 aussi accepter ou renvoyer n'importe quel type composite (type ligne) spécifié … … 250 250 avec des paramètres en sortie à la place de la spécification explicite 251 251 du code de retour. Ceci n'ajoute pas de fonctionnalité fondamentale au 252 langage mais c'est un moyen souvent agréable, spécialement pour retourner252 langage mais c'est un moyen agréable principalement pour renvoyer 253 253 plusieurs valeurs. 254 254 </para> … … 474 474 Chaque déclaration et chaque expression au sein du bloc est terminé par un 475 475 point-virgule. Un bloc qui apparaît à l'intérieur d'un autre bloc doit avoir 476 un point-virgule après <literal>END</literal> , comme montré ci-dessus ;476 un point-virgule après <literal>END</literal> (voir l'exemple ci-dessus) ; 477 477 néanmoins, le <literal>END</literal> final qui conclut le corps d'une fonction 478 478 n'a pas besoin de point-virgule. … … 536 536 contrôle des transactions. Les <command>BEGIN</command>/<command>END</command> de 537 537 <application>PL/pgSQL</application> ne servent qu'au groupement ; ils ne débutent 538 ni ne terminent une transaction. Les procédures fonctions et déclencheurs538 ni ne terminent une transaction. Les fonctions standards et les fonctions triggers 539 539 sont toujours exécutées à l'intérieur d'une transaction établie par une 540 540 requête extérieure — ils ne peuvent pas être utilisés pour commencer … … 555 555 La seule exception est que la variable de boucle d'une boucle <literal>FOR</literal> 556 556 effectuant une itération sur des valeurs entières est automatiquement déclarée 557 comme variable entière .557 comme variable entière (type integer). 558 558 </para> 559 559 … … 667 667 <literal>$<replaceable>n</replaceable></literal> et des alias optionnels 668 668 de la même façon que les paramètres en entrée. Un paramètre en sortie est 669 réellementune variable qui commence avec la valeur NULL ; il669 une variable qui commence avec la valeur NULL ; il 670 670 devrait se voir attribuer une valeur lors de l'exécution de la fonction. 671 671 La valeur finale du paramètre est ce qui est renvoyée. Par exemple, 672 l'exemple sales-tax aurait pu être écritde cette façon :672 l'exemple taxe_ventes peut s'écrire de cette façon : 673 673 674 674 <programlisting>CREATE FUNCTION taxe_ventes(sous_total real, OUT taxe real) AS $$ … … 679 679 </programlisting> 680 680 681 Notez que nous avons omis <literal>RETURNS real</literal> — nous aurions681 Notez que nous avons omis <literal>RETURNS real</literal>. Nous aurions 682 682 pu l'inclure mais cela aurait été redondant. 683 683 </para> … … 751 751 <literal>%TYPE</literal> fournit le type de données d'une variable ou d'une 752 752 colonne de table. Vous pouvez l'utiliser pour déclarer des variables qui 753 contiendront des valeurs de base sde données. Par exemple, disons que vous753 contiendront des valeurs de base de données. Par exemple, disons que vous 754 754 avez une colonne nommée <literal>id_utilisateur</literal> dans votre table 755 755 <literal>utilisateurs</literal>. Pour déclarer une variable du même type de … … 797 797 <para> 798 798 Une variable ligne peut être déclarée de façon à avoir le même type que les lignes 799 d'une table ou vue existante, en utilisant la notation800 <replaceable>nom_table</replaceable><literal>%ROWTYPE</literal> 801 ou elle peut être déclarée en donnant un nom de type composite (chaque table799 d'une table ou d'une vue existante, en utilisant la notation 800 <replaceable>nom_table</replaceable><literal>%ROWTYPE</literal>. 801 Elle peut aussi être déclarée en donnant un nom de type composite. Chaque table 802 802 ayant un type de données associé du même nom, il importe peu dans 803 803 <productname>PostgreSQL</productname> que vous écriviez <literal>%ROWTYPE</literal> ou pas. 804 Cependant la forme utilisant <literal>%ROWTYPE</literal> est plus portable).804 Cependant, la forme utilisant <literal>%ROWTYPE</literal> est plus portable. 805 805 </para> 806 806 807 807 <para> 808 808 Les paramètres d'une fonction peuvent être des types composites 809 (lignes complètes de tables). Ence cas, l'identifiant correspondant809 (lignes complètes de tables). Dans ce cas, l'identifiant correspondant 810 810 <literal>$<replaceable>n</replaceable></literal> sera une variable ligne à partir de laquelle 811 les champs peuvent être sélectionnés , par exemple <literal>$1.id_utilisateur</literal>.812 </para> 813 814 <para> 815 Seules les colonnes définies par l'utilisateur d'une ligne de tablesont accessibles811 les champs peuvent être sélectionnés avec la notation pointée, par exemple <literal>$1.id_utilisateur</literal>. 812 </para> 813 814 <para> 815 Seules les colonnes définies par l'utilisateur sont accessibles 816 816 dans une variable de type ligne, et non l'OID ou d'autres colonnes systèmes (parce que 817 817 la ligne pourrait être issue d'une vue). Les champs du type ligne héritent des tailles … … 848 848 849 849 <para> 850 Les variables record sont similaires aux variables de type ligne mais n'ont pas de 851 structure prédéfinie. Elles empruntent la structure effective de type ligne 852 de la ligne à laquelle elles sont assignées durant une commande <command>SELECT</command> or <command>FOR</command>. 853 La sous-structure d'une variable record peut changer à chaque fois qu'on l'assigne. 854 Une conséquence de cela est que jusqu'à ce qu'elle ait été assignée, elle n'a pas de 855 sous-structure, et toutes les tentatives pour accéder à un de ses champs 856 entraîneront une erreur d'exécution. 850 Les variables record sont similaires aux variables de type ligne mais n'ont 851 pas de structure prédéfinie. Elles empruntent la structure effective de 852 type ligne de la ligne à laquelle elles sont affectées durant une commande 853 <command>SELECT</command> ou <command>FOR</command>. La sous-structure d'une 854 variable record peut changer à chaque fois qu'on l'affecte. Une conséquence 855 de cela est qu'elle n'a pas de sous-structure jusqu'à ce qu'elle ait été 856 affectée, et toutes les tentatives pour accéder à un de ses champs 857 entraînent une erreur d'exécution. 857 858 </para> 858 859 … … 863 864 il ne s'agit pas tout à fait du même concept qu'une variable record, même si 864 865 une telle fonction peut aussi utiliser une variable record pour contenir son 865 résultat. Dans les deux cas la structure réelle de la ligne n'est pas connue quand866 résultat. Dans les deux cas, la structure réelle de la ligne n'est pas connue quand 866 867 la fonction est écrite mais, dans le cas d'une fonction renvoyant un type 867 868 <type>record</type>, la structure réelle est déterminée quand la requête appelante est … … 878 879 <para> 879 880 En utilisant la déclaration <literal>RENAME</literal>, vous pouvez changer le nom d'une variable, 880 d'un record ou d'un row (ligne). C'est particulièrement utile si881 d'un record ou d'un ligne (ROW). C'est particulièrement utile si 881 882 <varname>NEW</varname> ou <varname>OLD</varname> doivent 882 être référencés par un autre nom dans une procédure déclencheur. Voir883 être référencés par un autre nom dans une procédure trigger. Voir 883 884 aussi <literal>ALIAS</literal>. 884 885 </para> … … 1168 1169 <para> 1169 1170 Un exemple : 1170 <programlisting>PERFORM cre ate_mv('cs_session_page_requests_mv', my_query);1171 <programlisting>PERFORM creer_vuemat('cs_session_page_requests_mv', ma_requete); 1171 1172 </programlisting> 1172 1173 </para> … … 1286 1287 pas besoin d'être doublés) : 1287 1288 <programlisting>EXECUTE 'UPDATE tbl SET ' 1288 || quote_ident( colname)1289 || quote_ident(nom_colonne) 1289 1290 || ' = ' 1290 || quote_literal(n ewvalue)1291 || ' WHERE key= '1292 || quote_literal( keyvalue);</programlisting>1291 || quote_literal(nouvelle_valeur) 1292 || ' WHERE cle = ' 1293 || quote_literal(valeur_cle);</programlisting> 1293 1294 </para> 1294 1295 … … 1345 1346 1346 1347 <para> 1347 Il y a plusieurs moyen de déterminer l'effet d'une commande. La première méthode 1348 est d'utiliser <command>GET DIAGNOSTICS</command>, qui a la forme 1349 suivante : 1348 Il y a plusieurs moyens pour déterminer l'effet d'une commande. La première méthode 1349 est d'utiliser <command>GET DIAGNOSTICS</command> : 1350 1350 1351 1351 <synopsis>GET DIAGNOSTICS <replaceable>variable</replaceable> = <replaceable>élément</replaceable> <optional> , ... </optional> ; 1352 1352 </synopsis> 1353 1353 1354 Cette commande permet la récupération des indicateurs d e l'état du système. Chaque1354 Cette commande permet la récupération des indicateurs d'état du système. Chaque 1355 1355 <replaceable>élément</replaceable> est un mot clé identifiant une valeur d'état devant 1356 être a ssignée à la variable indiquée (qui devrait être du bon type de donnée1357 pour pouvoir la recevoir.) Les items d'état actuellement disponibles sont1356 être affectée à la variable indiquée (qui doit être du bon type de donnée 1357 pour que l'affectation puisse se faire sans erreur.) Les éléments d'état actuellement disponibles sont 1358 1358 <varname>ROW_COUNT</varname>, le nombre de lignes traitées par la dernière commande 1359 1359 <acronym>SQL</acronym> envoyée au moteur <acronym>SQL</acronym>, et … … 1366 1366 <para> 1367 1367 Exemple : 1368 <programlisting>GET DIAGNOSTICS var_ integer = ROW_COUNT;1369 </programlisting> 1370 </para> 1371 1372 <para> 1373 La seconde méthode p ourdéterminer les effets d'une commande est la variable1368 <programlisting>GET DIAGNOSTICS var_entier = ROW_COUNT; 1369 </programlisting> 1370 </para> 1371 1372 <para> 1373 La seconde méthode permettant de déterminer les effets d'une commande est la variable 1374 1374 spéciale nommée <literal>FOUND</literal> de type <type>boolean</type>. 1375 <literal>FOUND</literal> commence par être false danschaque fonction1376 <application>PL/pgSQL</application>. Elle est positionnée par chacun edes types1377 d'instructions suivants .1375 La variable <literal>FOUND</literal> est initialisée à false au début de chaque fonction 1376 <application>PL/pgSQL</application>. Elle est positionnée par chacun des types 1377 d'instructions suivants : 1378 1378 <itemizedlist> 1379 1379 <listitem> … … 1412 1412 <command>FOR</command> record-set, 1413 1413 et <command>FOR</command> record-set dynamique). <literal>FOUND</literal> 1414 n'est positionné de cette façon que quand la boucle <command>FOR</command>1414 n'est positionnée de cette façon que quand la boucle <command>FOR</command> 1415 1415 s'achève ; 1416 1416 dans l'exécution de la chaîne, <literal>FOUND</literal> 1417 n'est pas modifiée par l'instruction <command>FOR</command>, bien qu' il1417 n'est pas modifiée par l'instruction <command>FOR</command>, bien qu'elle 1418 1418 puisse être modifié par l'exécution d'autres instructions situées 1419 1419 dans le corps de la boucle. … … 1424 1424 <literal>FOUND</literal> est une variable locale à l'intérieur de chaque 1425 1425 fonction <application>PL/pgSQL</application> ; chaque changement qui 1426 y est fait n'affecte que la fonction courante.1426 y est fait n'affecte que la fonction en cours. 1427 1427 </para> 1428 1428 … … 1464 1464 <para> 1465 1465 Lorsqu'elle renvoie un type scalaire, n'importe quelle expression peut être 1466 utilisée. Le résultat de l'expression sera automatiquement transtypévers le type1467 de retour de la fonction, comme décrit pour les a ssignations. Pour renvoyer une1466 utilisée. Le résultat de l'expression sera automatiquement converti vers le type 1467 de retour de la fonction, comme décrit pour les affectations. Pour renvoyer une 1468 1468 valeur composite (ligne), vous devez écrire une variable record ou ligne comme 1469 1469 <replaceable>expression</replaceable>. … … 1479 1479 Si vous déclarez que la fonction renvoie <type>void</type>, une 1480 1480 instruction <command>RETURN</command> peut être utilisée pour quitter 1481 rapidement la fonction ; mais n'écrivez pas uneexpression après1481 rapidement la fonction ; mais n'écrivez pas d'expression après 1482 1482 <command>RETURN</command>. 1483 1483 </para> … … 1487 1487 Si le contrôle atteint la fin du bloc de haut niveau de la fonction, 1488 1488 sans parvenir à une instruction <command>RETURN</command>, une erreur 1489 d'exécution survien dra. Néanmoins, cette restriction ne s'applique pas1489 d'exécution survient. Néanmoins, cette restriction ne s'applique pas 1490 1490 aux fonctions sans paramètre de sortie et aux fonctions renvoyant 1491 1491 <type>void</type>. Dans ces cas, une instruction … … 1606 1606 <literal>IF</literal>. Les instructions entre <literal>THEN</literal> et 1607 1607 <literal>END IF</literal> seront exécutées si la condition est vraie. Autrement, 1608 elles seront négligées.1608 elles seront ignorées. 1609 1609 </para> 1610 1610 … … 1630 1630 <para> 1631 1631 Les instructions <literal>IF-THEN-ELSE</literal> s'ajoutent au 1632 <literal>IF-THEN</literal> en vous permettant de spécifier un ensemble1633 d'instructions alternatif à exécuter si la condition est évaluée à false.1632 <literal>IF-THEN</literal> en vous permettant de spécifier un autre ensemble 1633 d'instructions à exécuter si la condition est fausse. 1634 1634 </para> 1635 1635 … … 1661 1661 l'exemple suivant : 1662 1662 <programlisting>IF demo_ligne.sexe = 'm' THEN 1663 joli_sexe := ''man'';1663 texte_sexe := ''homme''; 1664 1664 ELSE 1665 1665 IF demo_ligne.sexe = 'f' THEN 1666 joli_sexe := 'woman';1666 texte_sexe := 'femme'; 1667 1667 END IF; 1668 1668 END IF; … … 1760 1760 <command>RETURN</command>. Le <replaceable>label</replaceable> optionnel 1761 1761 peut être utilisé par les instructions <literal>EXIT</literal> et 1762 <literal>CONTINUE</literal> dans le cas de boucles imbriquées pour définir quelle1763 boucle doit êtreimpliquée.1762 <literal>CONTINUE</literal> dans le cas de boucles imbriquées pour définir la 1763 boucle impliquée. 1764 1764 </para> 1765 1765 </sect3> … … 1779 1779 Si aucun <replaceable>label</replaceable> n'est donné, la boucle la plus 1780 1780 imbriquée se termine et l'instruction suivant <literal>END LOOP</literal> est 1781 exécutée ensuite.1781 exécutée. 1782 1782 Si un <replaceable>label</replaceable> est donné, ce doit être 1783 1783 le label de la boucle, du bloc courant ou d'un niveau moins imbriqué. … … 1938 1938 <para> 1939 1939 Si la limite basse est plus grande que la limite haute (ou moins grande 1940 que, dans le cas du <literal>REVERSE</literal> case), le corps de la boucle1940 dans le cas du <literal>REVERSE</literal>), le corps de la boucle 1941 1941 n'est pas exécuté du tout. Aucune erreur n'est renvoyée. 1942 1942 </para> … … 1997 1997 <command>SELECT</command> source est spécifiée comme une expression chaîne, 1998 1998 évaluée et replanifiée à chaque entrée dans la boucle <literal>FOR</literal>. Ceci 1999 permet au programmeur de choisir la vitesse d'une requête préplanifiée, oula2000 flexibilité d'une requête dynamique, uniquement avec l a simpleinstruction1999 permet au développeur de choisir entre la vitesse d'une requête préplanifiée et la 2000 flexibilité d'une requête dynamique, uniquement avec l'instruction 2001 2001 <command>EXECUTE</command>. 2002 2002 </para> … … 2028 2028 <para> 2029 2029 Par défaut, toute erreur survenant dans une fonction 2030 <application>PL/pgSQL</application> annule l'exécution de la fonction et, en fait,2030 <application>PL/pgSQL</application> annule l'exécution de la fonction mais 2031 2031 aussi de la transaction qui l'entoure. Vous pouvez récupérer les erreurs 2032 e t les surpasser en utilisant un bloc <command>BEGIN</command> avec une clause2032 en utilisant un bloc <command>BEGIN</command> avec une clause 2033 2033 <literal>EXCEPTION</literal>. La syntaxe est une extension de la syntaxe 2034 2034 habituelle pour un bloc <command>BEGIN</command> : … … 2041 2041 EXCEPTION 2042 2042 WHEN <replaceable>condition</replaceable> <optional> OR <replaceable>condition</replaceable> ... </optional> THEN 2043 <replaceable>instructions_gestion naire</replaceable>2043 <replaceable>instructions_gestion_erreurs</replaceable> 2044 2044 <optional> WHEN <replaceable>condition</replaceable> <optional> OR <replaceable>condition</replaceable> ... </optional> THEN 2045 <replaceable>instructions_gestion naire</replaceable>2045 <replaceable>instructions_gestion_erreurs</replaceable> 2046 2046 ... </optional> 2047 2047 END; … … 2059 2059 <replaceable>condition</replaceable> correspondant à l'erreur survenue. 2060 2060 Si une correspondance est trouvée, les 2061 <replaceable>instructions_gestion naire</replaceable> correspondantes2061 <replaceable>instructions_gestion_erreurs</replaceable> correspondantes 2062 2062 sont exécutées puis le contrôle est passé à l'instruction suivant le 2063 2063 <literal>END</literal>. Si aucune correspondance n'est trouvée, l'erreur se … … 2069 2069 2070 2070 <para> 2071 Les noms des <replaceable>condition</replaceable> peuvent être 2072 n'importe laquelle parmi celles listées dans l'<xref 2073 linkend="errcodes-appendix"/>. Un nom de catégorie correspond à toute 2071 Les noms des <replaceable>condition</replaceable> sont indiquées dans 2072 l'<xref linkend="errcodes-appendix"/>. Un nom de catégorie correspond à toute 2074 2073 erreur contenue dans cette catégorie. Le nom de condition spéciale 2075 2074 <literal>OTHERS</literal> correspond à tout type d'erreur sauf … … 2081 2080 <para> 2082 2081 Si une nouvelle erreur survient à l'intérieur des 2083 <replaceable>instructions_gestion naire</replaceable> sélectionnées, elle2082 <replaceable>instructions_gestion_erreurs</replaceable> sélectionnées, elle 2084 2083 ne peut pas être récupérée par cette clause <literal>EXCEPTION</literal> mais 2085 2084 est propagée en dehors. Une clause <literal>EXCEPTION</literal> l'englobant … … 2089 2088 <para> 2090 2089 Quand une erreur est récupérée par une clause <literal>EXCEPTION</literal>, les 2091 variables locales de la fonction <application>PL/pgSQL</application> reste comme2092 elles étaientau moment où l'erreur est survenue mais toutes les2090 variables locales de la fonction <application>PL/pgSQL</application> restent 2091 dans le même état qu'au moment où l'erreur est survenue mais toutes les 2093 2092 modifications à l'état persistant de la base de données à l'intérieur 2094 2093 du bloc sont annulées. Comme exemple, considérez ce fragment : … … 2101 2100 EXCEPTION 2102 2101 WHEN division_by_zero THEN 2103 RAISE NOTICE ' caughtdivision_by_zero';2102 RAISE NOTICE 'récupération de l''erreur division_by_zero'; 2104 2103 RETURN x; 2105 2104 END; … … 2187 2186 préoccuper de cela puisque les boucles <literal>FOR</literal> utilisent automatiquement un 2188 2187 curseur en interne pour éviter les problèmes de mémoire). Un usage plus intéressant est 2189 de renvoyer une référence à un curseur qu' ellea créé, permettant à l'appelant de2190 lire les lignes. C eci fournit un moyen efficace de renvoyer de grands ensembles de2188 de renvoyer une référence à un curseur qu'une fonction a créé, permettant à l'appelant de 2189 lire les lignes. C'est un moyen efficace de renvoyer de grands ensembles de 2191 2190 lignes à partir des fonctions. 2192 2191 </para> … … 2220 2219 </programlisting> 2221 2220 Ces variables sont toutes trois du type de données <type>refcursor</type> 2222 mais la première peut être utilisée savec n'importe quelle requête alors que2221 mais la première peut être utilisée avec n'importe quelle requête alors que 2223 2222 la seconde a une requête complètement spécifiée qui lui est déjà 2224 2223 <firstterm>liée</firstterm>, et la dernière est liée à une requête paramétrée … … 2236 2235 Avant qu'un curseur puisse être utilisé pour rapatrier des lignes, il doit être 2237 2236 <firstterm>ouvert</firstterm> (c'est l'action équivalente de la commande SQL 2238 <command>DECLARE CURSOR</command>). <application>PL/pgSQL</application> a trois formes pour 2237 <command>DECLARE CURSOR</command>). <application>PL/pgSQL</application> 2238 dispose de trois formes pour 2239 2239 l'instruction <command>OPEN</command>, dont deux utilisent des variables curseur non liées 2240 et l 'autre utilise une variable curseur liée.2240 et la dernière une variable curseur liée. 2241 2241 </para> 2242 2242 … … 2250 2250 La variable curseur est ouverte et reçoit la requête spécifiée à 2251 2251 exécuter. Le curseur ne peut pas être déjà ouvert, et il doit avoir 2252 été déclaré comme curseur non lié (c'est àdire comme une simple2252 été déclaré comme curseur non lié (c'est-à-dire comme une simple 2253 2253 variable <type>refcursor</type>). La requête doit être un 2254 2254 <command>SELECT</command> ou quelque chose d'autre qui renvoie des 2255 2255 lignes (comme <command>EXPLAIN</command>). La requête est traitée de la même 2256 2256 façon que les autres commandes SQL dans <application>PL/pgSQL</application> : 2257 les noms de variables <application>PL/pgSQL</application> sont substitué es et2257 les noms de variables <application>PL/pgSQL</application> sont substitués et 2258 2258 le plan de requête est mis en cache pour une possible ré-utilisation. 2259 2259 </para> … … 2329 2329 (d'un point de vue interne, une valeur <type>refcursor</type> est simplement 2330 2330 la chaîne de caractères du nom d'un portail contenant la requête active 2331 pour le curseur. Ce nom peut être passé à d'autres, a ssigné à d'autres variables2331 pour le curseur. Ce nom peut être passé à d'autres, affecté à d'autres variables 2332 2332 <type>refcursor</type> et ainsi de suite, sans déranger le portail). 2333 2333 </para> … … 2370 2370 <para> 2371 2371 <command>CLOSE</command> ferme le portail sous-tendant un curseur ouvert. Ceci peut 2372 être utilisé pour libérer des ressources avant la fin de la transaction ou de2372 être utilisé pour libérer des ressources avant la fin de la transaction ou pour 2373 2373 libérer la variable curseur pour pouvoir la réouvrir. 2374 2374 </para> … … 2415 2415 le surcharge par affectation avant d'ouvrir le curseur. Mais, une 2416 2416 variable curseur sans limite aura par défaut la valeur NULL, dont il 2417 re cevraun nom unique généré automatiquement sauf s'il est surchargé.2417 reçoit un nom unique généré automatiquement sauf s'il est surchargé. 2418 2418 </para> 2419 2419 </note> … … 2517 2517 <literal>EXCEPTION</literal> lève une erreur (ce qui annule habituellement 2518 2518 la transaction en cours). Les autres niveaux ne font que générer des messages aux 2519 différents niveaux de priorité. Quand les messages d'une priorité 2520 particulière sont indiqués par le client, écrit dans les traces du serveur 2521 ou à la fois contrôlé par les variables de configuration 2522 <xref linkend="guc-log-min-messages"/> et 2523 <xref linkend="guc-client-min-messages"/>. Voir le 2519 différents niveaux de priorité. 2520 Les variables de configuration <xref linkend="guc-log-min-messages"/> et 2521 <xref linkend="guc-client-min-messages"/> contrôlent l'envoi de messages 2522 dans les traces, au client ou aux deux. Voir le 2524 2523 <xref linkend="runtime-config"/> pour plus d'informations. 2525 2524 </para> … … 2540 2539 2541 2540 <para> 2542 Dans cet exemple, la valeur de <literal>v_job_id</literal> remplace rale <literal>%</literal>2541 Dans cet exemple, la valeur de <literal>v_job_id</literal> remplace le <literal>%</literal> 2543 2542 dans la chaîne. 2544 <programlisting>RAISE NOTICE ' Calling cs_create_job(%)', v_job_id;2545 </programlisting> 2546 </para> 2547 2548 <para> 2549 Cet exemple interromp rala transaction avec le message d'erreur donné.2550 <programlisting>RAISE EXCEPTION ' Nonexistent ID--> %', id_utilisateur;2543 <programlisting>RAISE NOTICE 'Appel de cs_creer_job(%)', v_job_id; 2544 </programlisting> 2545 </para> 2546 2547 <para> 2548 Cet exemple interromp la transaction avec le message d'erreur donné. 2549 <programlisting>RAISE EXCEPTION 'ID inexistant --> %', id_utilisateur; 2551 2550 </programlisting> 2552 2551 </para> … … 2562 2561 2563 2562 <sect1 id="plpgsql-trigger"> 2564 <title>Procédures déclencheur</title>2563 <title>Procédures trigger</title> 2565 2564 2566 2565 <indexterm zone="plpgsql-trigger"> 2567 2566 <primary>déclencheur (trigger)</primary> 2568 <secondary> in PL/pgSQL</secondary>2567 <secondary>en PL/pgSQL</secondary> 2569 2568 </indexterm> 2570 2569 2571 2570 <para> 2572 2571 <application>PL/pgSQL</application> peut être utilisé pour définir des 2573 procédures déclencheur. Une procédure déclencheur est créée grâce à la commande2572 procédures trigger. Une procédure trigger est créée grâce à la commande 2574 2573 <command>CREATE FUNCTION</command> utilisée comme fonction sans arguments 2575 2574 ayant un type de retour <type>trigger</type>. Notez que la fonction … … 2592 2591 Type de données <type>RECORD</type> ; variable contenant la nouvelle ligne 2593 2592 de base de données pour les opérations <command>INSERT</command>/<command>UPDATE</command> 2594 dans les déclencheurs de niveau ligne. Cette variable est2595 <symbol>NULL</symbol> dans un déclencheur de niveau instruction.2593 dans les triggers de niveau ligne. Cette variable est 2594 <symbol>NULL</symbol> dans un trigger de niveau instruction. 2596 2595 </para> 2597 2596 </listitem> … … 2604 2603 Type de données <type>RECORD</type> ; variable contenant l'ancienne ligne de 2605 2604 base de données pour les opérations <command>UPDATE</command>/<command>DELETE</command> 2606 dans les déclencheurs de niveau ligne. Cette variable est <symbol>NULL</symbol>2607 dans les déclencheurs de niveau instruction.2605 dans les triggers de niveau ligne. Cette variable est <symbol>NULL</symbol> 2606 dans les triggers de niveau instruction. 2608 2607 </para> 2609 2608 </listitem> … … 2614 2613 <listitem> 2615 2614 <para> 2616 Type de données <type>n om</type> ; variable qui contient le nom du déclencheur réellement2615 Type de données <type>name</type> ; variable qui contient le nom du trigger réellement 2617 2616 lancé. 2618 2617 </para> … … 2625 2624 <para> 2626 2625 Type de données <type>text</type> ; une chaîne, soit <literal>BEFORE</literal> 2627 soit <literal>AFTER</literal> selon la définition du déclencheur.2626 soit <literal>AFTER</literal>, selon la définition du trigger. 2628 2627 </para> 2629 2628 </listitem> … … 2635 2634 <para> 2636 2635 Type de données <type>text</type> ; une chaîne, soit <literal>ROW</literal> soit 2637 <literal>STATEMENT</literal> selon la définition du déclencheur.2636 <literal>STATEMENT</literal>, selon la définition du trigger. 2638 2637 </para> 2639 2638 </listitem> … … 2646 2645 Type de données <type>text</type> ; une chaîne, <literal>INSERT</literal>, 2647 2646 <literal>UPDATE</literal> ou <literal>DELETE</literal>, indiquant 2648 pour quelle opération le déclencheur a été lancé.2647 pour quelle opération le trigger a été lancé. 2649 2648 </para> 2650 2649 </listitem> … … 2656 2655 <para> 2657 2656 Type de données <type>oid</type> ; l'ID de l'objet de la table qui a causé 2658 le déclenchement .2657 le déclenchement du trigger. 2659 2658 </para> 2660 2659 </listitem> … … 2676 2675 <para> 2677 2676 Type de données <type>integer</type> ; le nombre d'arguments donnés à la procédure 2678 déclencheur dans l'instruction <command>CREATE TRIGGER</command>.2677 trigger dans l'instruction <command>CREATE TRIGGER</command>. 2679 2678 </para> 2680 2679 </listitem> … … 2696 2695 2697 2696 <para> 2698 Une fonction déclencheur doit renvoyer soit <symbol>NULL</symbol> soit une2699 valeur record /ligneayant2700 exactement la structure de la table pour laquelle le déclencheur a été lancé.2701 </para> 2702 2703 <para> 2704 Les déclencheurs de niveau ligne lancés <literal>BEFORE</literal> peuvent renvoyer NULL2705 pour indiquer au gestionnaire de déclencheur de sauter le reste de l'opération pour2706 cette ligne (les déclencheurs suivants ne sont pas lancés, et les2697 Une fonction trigger doit renvoyer soit <symbol>NULL</symbol> soit une 2698 valeur record ayant 2699 exactement la structure de la table pour laquelle le trigger a été lancé. 2700 </para> 2701 2702 <para> 2703 Les triggers de niveau ligne lancés <literal>BEFORE</literal> peuvent renvoyer NULL 2704 pour indiquer au gestionnaire de trigger de sauter le reste de l'opération pour 2705 cette ligne (les triggers suivants ne sont pas lancés, et les 2707 2706 <command>INSERT</command>/<command>UPDATE</command>/<command>DELETE</command> ne se font pas pour cette 2708 2707 ligne). Si une valeur non NULL est renvoyée alors l'opération se déroule avec cette … … 2716 2715 2717 2716 <para> 2718 La valeur de retour d'un déclencheur de niveau instruction <literal>BEFORE</literal> ou2719 <literal>AFTER</literal> ou un déclencheur de niveau ligne <literal>AFTER</literal> est2717 La valeur de retour d'un trigger de niveau instruction <literal>BEFORE</literal> ou 2718 <literal>AFTER</literal> ou un trigger de niveau ligne <literal>AFTER</literal> est 2720 2719 toujours ignoré ; il pourrait aussi bien être NULL. Néanmoins, tous les 2721 types de déclencheurs peuvent toujours annuler l'opération complète en2720 types de triggers peuvent toujours annuler l'opération complète en 2722 2721 envoyant une erreur. 2723 2722 </para> … … 2725 2724 <para> 2726 2725 L'<xref linkend="plpgsql-trigger-example"/> montre un exemple d'une procédure 2727 déclencheur dans <application>PL/pgSQL</application>.2726 trigger dans <application>PL/pgSQL</application>. 2728 2727 </para> 2729 2728 2730 2729 <example id="plpgsql-trigger-example"> 2731 <title>Une procédure déclencheur <application>PL/pgSQL</application> </title>2732 2733 <para> 2734 Cet exemple de déclencheur assure qu'à chaque moment où une ligne est insérée ou2730 <title>Une procédure trigger <application>PL/pgSQL</application> </title> 2731 2732 <para> 2733 Cet exemple de trigger assure qu'à chaque moment où une ligne est insérée ou 2735 2734 mise à jour dans la table, le nom de l'utilisateur courant et l'heure sont estampillés 2736 2735 dans la ligne. Et cela vous assure qu'un nom d'employé est donné et que le salaire … … 2739 2738 2740 2739 <programlisting>CREATE TABLE emp ( 2741 empname text,2742 sala ryinteger,2743 last_datetimestamp,2744 last_usertext2740 nom_employe text, 2741 salaire integer, 2742 date_dermodif timestamp, 2743 utilisateur_dermodif text 2745 2744 ); 2746 2745 2747 2746 CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$ 2748 2747 BEGIN 2749 -- Verifie que empname et salary sont donnés2750 IF NEW. empname IS NULL THEN2751 RAISE EXCEPTION ' empname cannot be NULL';2748 -- Verifie que nom_employe et salary sont donnés 2749 IF NEW.nom_employe IS NULL THEN 2750 RAISE EXCEPTION 'nom_employe ne peut pas être NULL'; 2752 2751 END IF; 2753 IF NEW.sala ryIS NULL THEN2754 RAISE EXCEPTION '% cannot have NULL salary', NEW.empname;2752 IF NEW.salaire IS NULL THEN 2753 RAISE EXCEPTION '% ne peut pas avoir un salaire', NEW.nom_employe; 2755 2754 END IF; 2756 2755 2757 -- Qui travaille pour nous quand elle doit payer pour cela ?2758 IF NEW.sala ry< 0 THEN2759 RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;2756 -- Qui travaille pour nous si la personne doit payer pour cela ? 2757 IF NEW.salaire < 0 THEN 2758 RAISE EXCEPTION '% ne peut pas avoir un salaire négatif', NEW.nom_employe; 2760 2759 END IF; 2761 2760 2762 -- Rappelons nous qui a changé le payroll quand2763 NEW. last_date:= current_timestamp;2764 NEW. last_user:= current_user;2761 -- Rappelons-nous qui a changé le salaire et quand 2762 NEW.date_dermodif := current_timestamp; 2763 NEW.date_dermodif := current_user; 2765 2764 RETURN NEW; 2766 2765 END; … … 2778 2777 être vue comme un audit des modifications sur une table. 2779 2778 L'<xref linkend="plpgsql-trigger-audit-example"/> montre un exemple d'une 2780 procédure d'audit par déclencheur en <application>PL/pgSQL</application>.2779 procédure d'audit par trigger en <application>PL/pgSQL</application>. 2781 2780 </para> 2782 2781 2783 2782 <example id="plpgsql-trigger-audit-example"> 2784 <title>Une procédure d'audit par déclencheur en2783 <title>Une procédure d'audit par trigger en 2785 2784 <application>PL/pgSQL</application></title> 2786 2785 2787 2786 <para> 2788 Cet exemple de déclencheur nous assure que toute insertion,2787 Cet exemple de trigger nous assure que toute insertion, 2789 2788 modification ou suppression d'une ligne dans la table 2790 2789 <literal>emp</literal> est enregistrée dans la … … 2794 2793 2795 2794 <programlisting>CREATE TABLE emp ( 2796 empnametext NOT NULL,2797 sala ryinteger2795 nom_employe text NOT NULL, 2796 salaire integer 2798 2797 ); 2799 2798 2800 2799 CREATE TABLE emp_audit( 2801 2800 operation char(1) NOT NULL, 2802 stamptimestamp NOT NULL,2803 useridtext NOT NULL,2804 empnametext NOT NULL,2805 sala ryinteger2801 tampon timestamp NOT NULL, 2802 id_utilisateur text NOT NULL, 2803 nom_employe text NOT NULL, 2804 salaire integer 2806 2805 ); 2807 2806 2808 CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$2807 CREATE OR REPLACE FUNCTION audit_employe() RETURNS TRIGGER AS $emp_audit$ 2809 2808 BEGIN 2810 2809 -- … … 2823 2822 RETURN NEW; 2824 2823 END IF; 2825 RETURN NULL; -- le résultat est ignoré car il s'agit d'un déclencheur AFTER2824 RETURN NULL; -- le résultat est ignoré car il s'agit d'un trigger AFTER 2826 2825 END; 2827 2826 $emp_audit$ language plpgsql; … … 2829 2828 CREATE TRIGGER emp_audit 2830 2829 AFTER INSERT OR UPDATE OR DELETE ON emp 2831 FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();2830 FOR EACH ROW EXECUTE PROCEDURE audit_employe(); 2832 2831 </programlisting> 2833 2832 </example> 2834 2833 2835 2834 <para> 2836 Une utilisation des déclencheurs est le maintien d'une table résumée2835 Une utilisation des triggers est le maintien d'une table résumée 2837 2836 d'une autre table. Le résumé résultant peut être utilisé à la place de 2838 2837 la table originale pour certaines requêtes — souvent avec des … … 2841 2840 observées (appelées des tables de faits) peuvent être extrêmement 2842 2841 grandes. L'<xref linkend="plpgsql-trigger-summary-example"/> montre un 2843 exemple d'une procédure déclencheur en2842 exemple d'une procédure trigger en 2844 2843 <application>PL/pgSQL</application> maintenant une table résumée pour 2845 2844 une table de faits dans un système de données (data warehouse). … … 2848 2847 2849 2848 <example id="plpgsql-trigger-summary-example"> 2850 <title>Une procédure déclencheur <application>PL/pgSQL</application>2849 <title>Une procédure trigger <application>PL/pgSQL</application> 2851 2850 pour maintenir une table résumée</title> 2852 2851 … … 2892 2891 2893 2892 -- 2894 -- Fonction et déclencheur pour amender les colonnes résumées2893 -- Fonction et trigger pour amender les colonnes résumées 2895 2894 -- pour un UPDATE, INSERT, DELETE. 2896 2895 -- … … 3014 3013 <application>PL/pgSQL</application> est similaire à PL/SQL sur de nombreux aspects. 3015 3014 C'est un langage itératif structuré en blocs et toutes les variables doivent 3016 être déclarées. Les a ssignations, boucles, conditionnelles sont similaires. Les3015 être déclarées. Les affectations, boucles, conditionnelles sont similaires. Les 3017 3016 principales différences que vous devez garder à l'esprit quand vous portez de 3018 3017 <application>PL/SQL</application> vers <application>PL/pgSQL</application> sont: traduc/branches/bv82x/manuel/plpgsql.xml
r727 r792 18 18 <listitem> 19 19 <para> 20 est utilisé pour créer des procédures fonctions et déclencheurs,20 est utilisé pour créer des fonctions standards et triggers, 21 21 </para> 22 22 </listitem> … … 28 28 <listitem> 29 29 <para> 30 pe uteffectuer des traitements complexes,30 permet d'effectuer des traitements complexes, 31 31 </para> 32 32 </listitem> … … 39 39 <listitem> 40 40 <para> 41 peut êtredéfini comme digne de confiance par le serveur,41 est défini comme digne de confiance par le serveur, 42 42 </para> 43 43 </listitem> … … 200 200 <para> 201 201 Les fonctions écrites en <application>PL/pgSQL</application> peuvent accepter 202 commeargument n'importe quel type de données supporté par le serveur, et202 en argument n'importe quel type de données supporté par le serveur, et 203 203 peuvent renvoyer un résultat de n'importe lequel de ces types. Elles peuvent 204 204 aussi accepter ou renvoyer n'importe quel type composite (type ligne) spécifié … … 236 236 avec des paramètres en sortie à la place de la spécification explicite 237 237 du code de retour. Ceci n'ajoute pas de fonctionnalité fondamentale au 238 langage mais c'est un moyen souvent agréable, spécialement pour retourner238 langage mais c'est un moyen agréable principalement pour renvoyer 239 239 plusieurs valeurs. 240 240 </para> … … 455 455 Chaque déclaration et chaque expression au sein du bloc est terminé par un 456 456 point-virgule. Un bloc qui apparaît à l'intérieur d'un autre bloc doit avoir 457 un point-virgule après <literal>END</literal> , comme montré ci-dessus ;457 un point-virgule après <literal>END</literal> (voir l'exemple ci-dessus) ; 458 458 néanmoins, le <literal>END</literal> final qui conclut le corps d'une fonction 459 459 n'a pas besoin de point-virgule. … … 517 517 contrôle des transactions. Les <command>BEGIN</command>/<command>END</command> de 518 518 <application>PL/pgSQL</application> ne servent qu'au groupement ; ils ne débutent 519 ni ne terminent une transaction. Les procédures fonctions et déclencheurs519 ni ne terminent une transaction. Les fonctions standards et les fonctions triggers 520 520 sont toujours exécutées à l'intérieur d'une transaction établie par une 521 521 requête extérieure — ils ne peuvent pas être utilisés pour commencer … … 536 536 La seule exception est que la variable de boucle d'une boucle <literal>FOR</literal> 537 537 effectuant une itération sur des valeurs entières est automatiquement déclarée 538 comme variable entière .538 comme variable entière (type integer). 539 539 </para> 540 540 … … 546 546 547 547 <para> 548 Quelques exemples de déclaration sde variables :548 Quelques exemples de déclaration de variables : 549 549 <programlisting>id_utilisateur integer; 550 550 quantité numeric(5); … … 648 648 <literal>$<replaceable>n</replaceable></literal> et des alias optionnels 649 649 de la même façon que les paramètres en entrée. Un paramètre en sortie est 650 réellementune variable qui commence avec la valeur NULL ; il650 une variable qui commence avec la valeur NULL ; il 651 651 devrait se voir attribuer une valeur lors de l'exécution de la fonction. 652 652 La valeur finale du paramètre est ce qui est renvoyée. Par exemple, 653 l'exemple sales-tax aurait pu être écritde cette façon :653 l'exemple taxe_ventes peut s'écrire de cette façon : 654 654 655 655 <programlisting>CREATE FUNCTION taxe_ventes(sous_total real, OUT taxe real) AS $$ … … 660 660 </programlisting> 661 661 662 Notez que nous avons omis <literal>RETURNS real</literal> — nous aurions662 Notez que nous avons omis <literal>RETURNS real</literal>. Nous aurions 663 663 pu l'inclure mais cela aura

