Changeset 792

Show
Ignore:
Timestamp:
11/18/07 16:46:46 (1 year ago)
Author:
gleu
Message:

Application du précédent patch aux manuels des versions 8.2 et 8.1 (les deux autres sont en SGML, tant pis pour eux).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • traduc/branches/bv81x/manuel/plpgsql.xml

    r727 r792  
    2020     <listitem> 
    2121      <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, 
    2323      </para> 
    2424     </listitem> 
     
    3030     <listitem> 
    3131      <para> 
    32        peut effectuer des traitements complexes, 
     32       permet d'effectuer des traitements complexes, 
    3333      </para> 
    3434     </listitem> 
     
    4141     <listitem> 
    4242      <para> 
    43        peut être défini comme digne de confiance par le serveur, 
     43       est défini comme digne de confiance par le serveur, 
    4444      </para> 
    4545     </listitem> 
     
    203203    <para> 
    204204     Les fonctions écrites en <application>PL/pgSQL</application> peuvent accepter 
    205      comme argument n'importe quel type de données supporté par le serveur, et  
     205     en argument n'importe quel type de données supporté par le serveur, et  
    206206     peuvent renvoyer un résultat de n'importe lequel de ces types. Elles peuvent 
    207207     aussi accepter ou renvoyer n'importe quel type composite (type ligne) spécifié 
     
    250250     avec des paramètres en sortie à la place de la spécification explicite 
    251251     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 retourner 
     252     langage mais c'est un moyen agréable principalement pour renvoyer 
    253253     plusieurs valeurs. 
    254254    </para> 
     
    474474     Chaque déclaration et chaque expression au sein du bloc est terminé par un 
    475475     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&nbsp;; 
     476     un point-virgule après <literal>END</literal> (voir l'exemple ci-dessus)&nbsp;; 
    477477     néanmoins, le <literal>END</literal> final qui conclut le corps d'une fonction 
    478478     n'a pas besoin de point-virgule. 
     
    536536     contrôle des transactions. Les <command>BEGIN</command>/<command>END</command> de 
    537537     <application>PL/pgSQL</application> ne servent qu'au groupement&nbsp;; ils ne débutent 
    538      ni ne terminent une transaction. Les procédures fonctions et déclencheurs 
     538     ni ne terminent une transaction. Les fonctions standards et les fonctions triggers 
    539539     sont toujours exécutées à l'intérieur d'une transaction établie par une 
    540540     requête extérieure &mdash; ils ne peuvent pas être utilisés pour commencer 
     
    555555     La seule exception est que la variable de boucle d'une boucle <literal>FOR</literal> 
    556556     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)
    558558     </para> 
    559559 
     
    667667      <literal>$<replaceable>n</replaceable></literal> et des alias optionnels 
    668668      de la même façon que les paramètres en entrée. Un paramètre en sortie est 
    669       réellement une variable qui commence avec la valeur NULL&nbsp;; il 
     669      une variable qui commence avec la valeur NULL&nbsp;; il 
    670670      devrait se voir attribuer une valeur lors de l'exécution de la fonction. 
    671671      La valeur finale du paramètre est ce qui est renvoyée. Par exemple, 
    672       l'exemple sales-tax aurait pu être écrit de cette façon&nbsp;: 
     672      l'exemple taxe_ventes peut s'écrire de cette façon&nbsp;: 
    673673 
    674674<programlisting>CREATE FUNCTION taxe_ventes(sous_total real, OUT taxe real) AS $$ 
     
    679679</programlisting> 
    680680 
    681       Notez que nous avons omis <literal>RETURNS real</literal> &mdash; nous aurions  
     681      Notez que nous avons omis <literal>RETURNS real</literal>. Nous aurions 
    682682      pu l'inclure mais cela aurait été redondant. 
    683683     </para> 
     
    751751    <literal>%TYPE</literal> fournit le type de données d'une variable ou d'une 
    752752    colonne de table. Vous pouvez l'utiliser pour déclarer des variables qui 
    753     contiendront des valeurs de bases de données. Par exemple, disons que vous 
     753    contiendront des valeurs de base de données. Par exemple, disons que vous 
    754754    avez une colonne nommée <literal>id_utilisateur</literal> dans votre table 
    755755    <literal>utilisateurs</literal>. Pour déclarer une variable du même type de 
     
    797797   <para> 
    798798    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 notation 
    800     <replaceable>nom_table</replaceable><literal>%ROWTYPE</literal> 
    801     ou elle peut être déclarée en donnant un nom de type composite (chaque table 
     799    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 
    802802    ayant un type de données associé du même nom, il importe peu dans  
    803803    <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
    805805   </para> 
    806806 
    807807   <para> 
    808808    Les paramètres d'une fonction peuvent être des types composites  
    809     (lignes complètes de tables). En ce cas, l'identifiant correspondant 
     809    (lignes complètes de tables). Dans ce cas, l'identifiant correspondant 
    810810    <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 table sont accessibles  
     811    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  
    816816    dans une variable de type ligne, et non l'OID ou d'autres colonnes systèmes (parce que 
    817817    la ligne pourrait être issue d'une vue). Les champs du type ligne héritent des tailles 
     
    848848 
    849849   <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. 
    857858   </para> 
    858859 
     
    863864    il ne s'agit pas tout à fait du même concept qu'une variable record, même si  
    864865    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 quand 
     866    résultat. Dans les deux cas, la structure réelle de la ligne n'est pas connue quand 
    866867    la fonction est écrite mais, dans le cas d'une fonction renvoyant un type 
    867868    <type>record</type>, la structure réelle est déterminée quand la requête appelante est 
     
    878879     <para> 
    879880      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 si 
     881      d'un record ou d'un ligne (ROW). C'est particulièrement utile si 
    881882      <varname>NEW</varname> ou <varname>OLD</varname> doivent 
    882       être référencés par un autre nom dans une procédure déclencheur. Voir 
     883      être référencés par un autre nom dans une procédure trigger. Voir 
    883884      aussi <literal>ALIAS</literal>. 
    884885     </para> 
     
    11681169    <para> 
    11691170     Un exemple&nbsp;: 
    1170 <programlisting>PERFORM create_mv('cs_session_page_requests_mv', my_query); 
     1171<programlisting>PERFORM creer_vuemat('cs_session_page_requests_mv', ma_requete); 
    11711172</programlisting> 
    11721173    </para> 
     
    12861287     pas besoin d'être doublés)&nbsp;: 
    12871288<programlisting>EXECUTE 'UPDATE tbl SET ' 
    1288     || quote_ident(colname) 
     1289    || quote_ident(nom_colonne) 
    12891290    || ' = ' 
    1290     || quote_literal(newvalue
    1291     || ' WHERE key = ' 
    1292     || quote_literal(keyvalue);</programlisting> 
     1291    || quote_literal(nouvelle_valeur
     1292    || ' WHERE cle = ' 
     1293    || quote_literal(valeur_cle);</programlisting> 
    12931294    </para> 
    12941295 
     
    13451346 
    13461347    <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&nbsp;: 
     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>&nbsp;: 
    13501350 
    13511351<synopsis>GET DIAGNOSTICS <replaceable>variable</replaceable> = <replaceable>élément</replaceable> <optional> , ... </optional> ; 
    13521352</synopsis> 
    13531353 
    1354      Cette commande permet la récupération des indicateurs de l'état du système. Chaque 
     1354     Cette commande permet la récupération des indicateurs d'état du système. Chaque 
    13551355     <replaceable>élément</replaceable> est un mot clé identifiant une valeur d'état devant 
    1356      être assignée à la variable indiquée (qui devrait être du bon type de donnée  
    1357      pour pouvoir la recevoir.) Les items d'état actuellement disponibles sont 
     1356     ê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 
    13581358     <varname>ROW_COUNT</varname>, le nombre de lignes traitées par la dernière commande 
    13591359     <acronym>SQL</acronym> envoyée au moteur <acronym>SQL</acronym>, et  
     
    13661366    <para> 
    13671367     Exemple&nbsp;: 
    1368 <programlisting>GET DIAGNOSTICS var_integer = ROW_COUNT; 
    1369 </programlisting> 
    1370     </para> 
    1371  
    1372     <para> 
    1373      La seconde méthode pour déterminer les effets d'une commande est la variable  
     1368<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  
    13741374     spéciale nommée <literal>FOUND</literal>  de type <type>boolean</type>.   
    1375      <literal>FOUND</literal> commence par être false dans chaque fonction  
    1376      <application>PL/pgSQL</application>. Elle est positionnée par chacune des types 
    1377      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&nbsp;: 
    13781378         <itemizedlist> 
    13791379          <listitem> 
     
    14121412                <command>FOR</command> record-set, 
    14131413                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> 
    14151415                s'achève&nbsp;; 
    14161416                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'il  
     1417                n'est pas modifiée par l'instruction <command>FOR</command>, bien qu'elle  
    14181418                puisse être modifié par l'exécution d'autres instructions situées 
    14191419                dans le corps de la boucle. 
     
    14241424     <literal>FOUND</literal> est une variable locale à l'intérieur de chaque 
    14251425     fonction <application>PL/pgSQL</application>&nbsp;; chaque changement qui 
    1426      y est fait n'affecte que la fonction courante
     1426     y est fait n'affecte que la fonction en cours
    14271427    </para> 
    14281428 
     
    14641464     <para> 
    14651465      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 type 
    1467       de retour de la fonction, comme décrit pour les assignations. Pour renvoyer une  
     1466      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  
    14681468      valeur composite (ligne), vous devez écrire une variable record ou ligne comme  
    14691469      <replaceable>expression</replaceable>. 
     
    14791479      Si vous déclarez que la fonction renvoie <type>void</type>, une 
    14801480      instruction <command>RETURN</command> peut être utilisée pour quitter 
    1481       rapidement la fonction&nbsp;; mais n'écrivez pas une expression après 
     1481      rapidement la fonction&nbsp;; mais n'écrivez pas d'expression après 
    14821482      <command>RETURN</command>. 
    14831483     </para> 
     
    14871487      Si le contrôle atteint la fin du bloc de haut niveau de la fonction, 
    14881488      sans parvenir à une instruction <command>RETURN</command>, une erreur 
    1489       d'exécution surviendra. Néanmoins, cette restriction ne s'applique pas 
     1489      d'exécution survient. Néanmoins, cette restriction ne s'applique pas 
    14901490      aux fonctions sans paramètre de sortie et aux fonctions renvoyant  
    14911491      <type>void</type>. Dans ces cas, une instruction 
     
    16061606        <literal>IF</literal>. Les instructions entre <literal>THEN</literal> et  
    16071607        <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. 
    16091609       </para> 
    16101610 
     
    16301630       <para> 
    16311631        Les instructions <literal>IF-THEN-ELSE</literal> s'ajoutent au 
    1632         <literal>IF-THEN</literal> en vous permettant de spécifier un ensemble 
    1633         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. 
    16341634        </para> 
    16351635 
     
    16611661        l'exemple suivant&nbsp;: 
    16621662<programlisting>IF demo_ligne.sexe = 'm' THEN 
    1663     joli_sexe := ''man''; 
     1663    texte_sexe := ''homme''; 
    16641664ELSE 
    16651665    IF demo_ligne.sexe = 'f' THEN 
    1666         joli_sexe := 'woman'; 
     1666        texte_sexe := 'femme'; 
    16671667    END IF; 
    16681668END IF; 
     
    17601760      <command>RETURN</command>.  Le <replaceable>label</replaceable> optionnel 
    17611761      peut être utilisé par les instructions <literal>EXIT</literal> et 
    1762       <literal>CONTINUE</literal> dans le cas de boucles imbriquées pour définir quelle 
    1763       boucle doit être impliquée. 
     1762      <literal>CONTINUE</literal> dans le cas de boucles imbriquées pour définir la 
     1763      boucle impliquée. 
    17641764     </para> 
    17651765    </sect3> 
     
    17791779        Si aucun <replaceable>label</replaceable> n'est donné, la boucle la plus 
    17801780        imbriquée se termine et l'instruction suivant <literal>END LOOP</literal> est 
    1781         exécutée ensuite
     1781        exécutée
    17821782        Si un <replaceable>label</replaceable> est donné, ce doit être  
    17831783        le label de la boucle, du bloc courant ou d'un niveau moins imbriqué. 
     
    19381938       <para> 
    19391939        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 boucle 
     1940        dans le cas du <literal>REVERSE</literal>), le corps de la boucle 
    19411941        n'est pas exécuté du tout. Aucune erreur n'est renvoyée. 
    19421942       </para> 
     
    19971997     <command>SELECT</command> source est spécifiée comme une expression chaîne, 
    19981998     é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, ou la  
    2000      flexibilité d'une requête dynamique, uniquement avec la simple instruction  
     1999     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  
    20012001     <command>EXECUTE</command>. 
    20022002    </para> 
     
    20282028    <para> 
    20292029      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 
    20312031      aussi de la transaction qui l'entoure. Vous pouvez récupérer les erreurs 
    2032       et les surpasser en utilisant un bloc <command>BEGIN</command> avec une clause 
     2032      en utilisant un bloc <command>BEGIN</command> avec une clause 
    20332033      <literal>EXCEPTION</literal>. La syntaxe est une extension de la syntaxe 
    20342034      habituelle pour un bloc <command>BEGIN</command>&nbsp;: 
     
    20412041  EXCEPTION 
    20422042  WHEN <replaceable>condition</replaceable> <optional> OR <replaceable>condition</replaceable> ... </optional> THEN 
    2043   <replaceable>instructions_gestionnaire</replaceable> 
     2043  <replaceable>instructions_gestion_erreurs</replaceable> 
    20442044  <optional> WHEN <replaceable>condition</replaceable> <optional> OR <replaceable>condition</replaceable> ... </optional> THEN 
    2045     <replaceable>instructions_gestionnaire</replaceable> 
     2045    <replaceable>instructions_gestion_erreurs</replaceable> 
    20462046    ... </optional> 
    20472047  END; 
     
    20592059      <replaceable>condition</replaceable> correspondant à l'erreur survenue. 
    20602060      Si une correspondance est trouvée, les 
    2061       <replaceable>instructions_gestionnaire</replaceable> correspondantes 
     2061      <replaceable>instructions_gestion_erreurs</replaceable> correspondantes 
    20622062      sont exécutées puis le contrôle est passé à l'instruction suivant le 
    20632063      <literal>END</literal>. Si aucune correspondance n'est trouvée, l'erreur se 
     
    20692069 
    20702070    <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 
    20742073      erreur contenue dans cette catégorie. Le nom de condition spéciale 
    20752074      <literal>OTHERS</literal> correspond à tout type d'erreur sauf 
     
    20812080    <para> 
    20822081      Si une nouvelle erreur survient à l'intérieur des 
    2083       <replaceable>instructions_gestionnaire</replaceable> sélectionnées, elle 
     2082      <replaceable>instructions_gestion_erreurs</replaceable> sélectionnées, elle 
    20842083      ne peut pas être récupérée par cette clause <literal>EXCEPTION</literal> mais 
    20852084      est propagée en dehors. Une clause <literal>EXCEPTION</literal> l'englobant 
     
    20892088    <para> 
    20902089      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 comme 
    2092       elles étaient au moment où l'erreur est survenue mais toutes les 
     2090      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 
    20932092      modifications à l'état persistant de la base de données à l'intérieur 
    20942093      du bloc sont annulées. Comme exemple, considérez ce fragment&nbsp;: 
     
    21012100  EXCEPTION 
    21022101    WHEN division_by_zero THEN 
    2103       RAISE NOTICE 'caught division_by_zero'; 
     2102      RAISE NOTICE 'récupération de l''erreur division_by_zero'; 
    21042103RETURN x; 
    21052104END; 
     
    21872186    préoccuper de cela puisque les boucles <literal>FOR</literal> utilisent automatiquement un 
    21882187    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'elle a créé, permettant à l'appelant de 
    2190     lire les lignes. Ceci fournit un moyen efficace de renvoyer de grands ensembles de 
     2188    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 
    21912190    lignes à partir des fonctions. 
    21922191   </para> 
     
    22202219</programlisting> 
    22212220     Ces variables sont toutes trois du type de données <type>refcursor</type> 
    2222      mais la première peut être utilisées avec n'importe quelle requête alors que 
     2221     mais la première peut être utilisée avec n'importe quelle requête alors que 
    22232222     la seconde a une requête complètement spécifiée qui lui est déjà 
    22242223     <firstterm>liée</firstterm>, et la dernière est liée à une requête paramétrée 
     
    22362235     Avant qu'un curseur puisse être utilisé pour rapatrier des lignes, il doit être 
    22372236     <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 
    22392239     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. 
    22412241    </para> 
    22422242 
     
    22502250        La variable curseur est ouverte et reçoit la requête spécifiée à  
    22512251        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 simple 
     2252        été déclaré comme curseur non lié (c'est-à-dire comme une simple 
    22532253        variable <type>refcursor</type>). La requête doit être un 
    22542254        <command>SELECT</command> ou quelque chose d'autre qui renvoie des 
    22552255        lignes (comme <command>EXPLAIN</command>). La requête est traitée de la même 
    22562256        façon que les autres commandes SQL dans <application>PL/pgSQL</application>&nbsp;: 
    2257         les noms de variables <application>PL/pgSQL</application> sont substituées et 
     2257        les noms de variables <application>PL/pgSQL</application> sont substitués et 
    22582258        le plan de requête est mis en cache pour une possible ré-utilisation. 
    22592259       </para> 
     
    23292329     (d'un point de vue interne, une valeur <type>refcursor</type> est simplement 
    23302330     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, assigné à d'autres variables 
     2331     pour le curseur. Ce nom peut être passé à d'autres, affecté à d'autres variables 
    23322332     <type>refcursor</type> et ainsi de suite, sans déranger le portail). 
    23332333    </para> 
     
    23702370       <para> 
    23712371    <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 de 
     2372    être utilisé pour libérer des ressources avant la fin de la transaction ou pour 
    23732373    libérer la variable curseur pour pouvoir la réouvrir. 
    23742374       </para> 
     
    24152415         le surcharge par affectation avant d'ouvrir le curseur. Mais, une 
    24162416         variable curseur sans limite aura par défaut la valeur NULL, dont il 
    2417          recevra un 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é. 
    24182418        </para> 
    24192419       </note> 
     
    25172517    <literal>EXCEPTION</literal> lève une erreur (ce qui annule habituellement 
    25182518    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 
    25242523    <xref linkend="runtime-config"/> pour plus d'informations. 
    25252524   </para> 
     
    25402539 
    25412540   <para> 
    2542     Dans cet exemple, la valeur de <literal>v_job_id</literal> remplacera le <literal>%</literal> 
     2541    Dans cet exemple, la valeur de <literal>v_job_id</literal> remplace le <literal>%</literal> 
    25432542    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 interrompra la 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; 
    25512550</programlisting> 
    25522551   </para> 
     
    25622561 
    25632562 <sect1 id="plpgsql-trigger"> 
    2564   <title>Procédures déclencheur</title> 
     2563  <title>Procédures trigger</title> 
    25652564 
    25662565  <indexterm zone="plpgsql-trigger"> 
    25672566   <primary>déclencheur (trigger)</primary> 
    2568    <secondary>in PL/pgSQL</secondary> 
     2567   <secondary>en PL/pgSQL</secondary> 
    25692568  </indexterm> 
    25702569 
    25712570  <para> 
    25722571        <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 commande 
     2572        procédures trigger. Une procédure trigger est créée grâce à la commande 
    25742573        <command>CREATE FUNCTION</command> utilisée comme fonction sans arguments 
    25752574        ayant un type de retour <type>trigger</type>.  Notez que la fonction  
     
    25922591       Type de données <type>RECORD</type>&nbsp;; variable contenant la nouvelle ligne  
    25932592       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 est 
    2595        <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. 
    25962595      </para> 
    25972596     </listitem> 
     
    26042603       Type de données <type>RECORD</type>&nbsp;; variable contenant l'ancienne ligne de  
    26052604       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. 
    26082607      </para> 
    26092608     </listitem> 
     
    26142613     <listitem> 
    26152614      <para> 
    2616        Type de données <type>nom</type>&nbsp;; variable qui contient le nom du déclencheur réellement 
     2615       Type de données <type>name</type>&nbsp;; variable qui contient le nom du trigger réellement 
    26172616       lancé. 
    26182617      </para> 
     
    26252624      <para> 
    26262625       Type de données <type>text</type>&nbsp;; 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. 
    26282627      </para> 
    26292628     </listitem> 
     
    26352634      <para> 
    26362635       Type de données <type>text</type>&nbsp;; 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. 
    26382637      </para> 
    26392638     </listitem> 
     
    26462645       Type de données <type>text</type>&nbsp;; une chaîne, <literal>INSERT</literal>, 
    26472646       <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é. 
    26492648      </para> 
    26502649     </listitem> 
     
    26562655      <para> 
    26572656       Type de données <type>oid</type>&nbsp;; l'ID de l'objet de la table qui a causé 
    2658        le déclenchement
     2657       le déclenchement du trigger
    26592658      </para> 
    26602659     </listitem> 
     
    26762675      <para> 
    26772676       Type de données <type>integer</type>&nbsp;; 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>. 
    26792678      </para> 
    26802679     </listitem> 
     
    26962695 
    26972696   <para> 
    2698     Une fonction déclencheur doit renvoyer soit <symbol>NULL</symbol> soit une 
    2699     valeur record/ligne ayant 
    2700     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 NULL  
    2705     pour indiquer au gestionnaire de déclencheur de sauter le reste de l'opération pour 
    2706     cette ligne (les déclencheurs suivants ne sont pas lancés, et les 
     2697    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 
    27072706    <command>INSERT</command>/<command>UPDATE</command>/<command>DELETE</command> ne se font pas pour cette  
    27082707    ligne). Si une valeur non NULL est renvoyée alors l'opération se déroule avec cette 
     
    27162715 
    27172716   <para> 
    2718     La valeur de retour d'un déclencheur de niveau instruction <literal>BEFORE</literal> ou 
    2719     <literal>AFTER</literal> ou un déclencheur de niveau ligne <literal>AFTER</literal> est 
     2717    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 
    27202719    toujours ignoré&nbsp;; il pourrait aussi bien être NULL. Néanmoins, tous les 
    2721     types de déclencheurs peuvent toujours annuler l'opération complète en 
     2720    types de triggers peuvent toujours annuler l'opération complète en 
    27222721    envoyant une erreur. 
    27232722   </para> 
     
    27252724   <para> 
    27262725    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>. 
    27282727   </para> 
    27292728 
    27302729   <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 ou  
     2730    <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  
    27352734     mise à jour dans la table, le nom de l'utilisateur courant et l'heure sont estampillés  
    27362735     dans la ligne. Et cela vous assure qu'un nom d'employé est donné et que le salaire 
     
    27392738 
    27402739<programlisting>CREATE TABLE emp ( 
    2741     empname text, 
    2742     salary integer, 
    2743     last_date timestamp, 
    2744     last_user text 
     2740    nom_employe text, 
     2741    salaire integer, 
     2742    date_dermodif timestamp, 
     2743    utilisateur_dermodif text 
    27452744); 
    27462745 
    27472746CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$ 
    27482747    BEGIN 
    2749         -- Verifie que empname et salary sont donnés 
    2750         IF NEW.empname IS NULL THEN 
    2751             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'; 
    27522751        END IF; 
    2753         IF NEW.salary IS NULL THEN 
    2754             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; 
    27552754        END IF; 
    27562755 
    2757         -- Qui travaille pour nous quand elle doit payer pour cela ? 
    2758         IF NEW.salary &lt; 0 THEN 
    2759             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 &lt; 0 THEN 
     2758            RAISE EXCEPTION '% ne peut pas avoir un salaire négatif', NEW.nom_employe; 
    27602759        END IF; 
    27612760 
    2762         -- Rappelons nous qui a changé le payroll quand  
    2763         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; 
    27652764        RETURN NEW; 
    27662765    END; 
     
    27782777    être vue comme un audit des modifications sur une table. 
    27792778    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>. 
    27812780   </para> 
    27822781     
    27832782    <example id="plpgsql-trigger-audit-example"> 
    2784       <title>Une procédure d'audit par déclencheur en 
     2783      <title>Une procédure d'audit par trigger en 
    27852784       <application>PL/pgSQL</application></title> 
    27862785       
    27872786      <para> 
    2788         Cet exemple de déclencheur nous assure que toute insertion, 
     2787        Cet exemple de trigger nous assure que toute insertion, 
    27892788        modification ou suppression d'une ligne dans la table  
    27902789        <literal>emp</literal> est enregistrée dans la 
     
    27942793       
    27952794<programlisting>CREATE TABLE emp ( 
    2796     empname           text NOT NULL, 
    2797     salary            integer 
     2795    nom_employe       text NOT NULL, 
     2796    salaire           integer 
    27982797); 
    27992798         
    28002799CREATE TABLE emp_audit(  
    28012800    operation         char(1)   NOT NULL, 
    2802     stamp             timestamp NOT NULL, 
    2803     userid            text      NOT NULL, 
    2804     empname           text      NOT NULL, 
    2805     salary integer 
     2801    tampon            timestamp NOT NULL, 
     2802    id_utilisateur    text      NOT NULL, 
     2803    nom_employe       text      NOT NULL, 
     2804    salaire          integer 
    28062805); 
    28072806         
    2808 CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$ 
     2807CREATE OR REPLACE FUNCTION audit_employe() RETURNS TRIGGER AS $emp_audit$ 
    28092808BEGIN 
    28102809    -- 
     
    28232822        RETURN NEW; 
    28242823    END IF; 
    2825     RETURN NULL; -- le résultat est ignoré car il s'agit d'un déclencheur AFTER 
     2824    RETURN NULL; -- le résultat est ignoré car il s'agit d'un trigger AFTER 
    28262825END; 
    28272826$emp_audit$ language plpgsql; 
     
    28292828CREATE TRIGGER emp_audit 
    28302829    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(); 
    28322831</programlisting> 
    28332832    </example> 
    28342833     
    28352834    <para> 
    2836       Une utilisation des déclencheurs est le maintien d'une table résumée 
     2835      Une utilisation des triggers est le maintien d'une table résumée 
    28372836      d'une autre table. Le résumé résultant peut être utilisé à la place de 
    28382837      la table originale pour certaines requêtes &mdash; souvent avec des 
     
    28412840      observées (appelées des tables de faits) peuvent être extrêmement 
    28422841      grandes. L'<xref linkend="plpgsql-trigger-summary-example"/> montre un 
    2843       exemple d'une procédure déclencheur en 
     2842      exemple d'une procédure trigger en 
    28442843      <application>PL/pgSQL</application> maintenant une table résumée pour 
    28452844      une table de faits dans un système de données (data warehouse). 
     
    28482847       
    28492848      <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> 
    28512850         pour maintenir une table résumée</title> 
    28522851         
     
    28922891           
    28932892-- 
    2894 -- Fonction et déclencheur pour amender les colonnes résumées 
     2893-- Fonction et trigger pour amender les colonnes résumées 
    28952894-- pour un UPDATE, INSERT, DELETE. 
    28962895-- 
     
    30143013   <application>PL/pgSQL</application> est similaire à PL/SQL sur de nombreux aspects. 
    30153014   C'est un langage itératif structuré en blocs et toutes les variables doivent 
    3016    être déclarées. Les assignations, boucles, conditionnelles sont similaires. Les  
     3015   être déclarées. Les affectations, boucles, conditionnelles sont similaires. Les  
    30173016   principales différences que vous devez garder à l'esprit quand vous portez de  
    30183017   <application>PL/SQL</application> vers <application>PL/pgSQL</application> sont: 
  • traduc/branches/bv82x/manuel/plpgsql.xml

    r727 r792  
    1818     <listitem> 
    1919      <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, 
    2121      </para> 
    2222     </listitem> 
     
    2828     <listitem> 
    2929      <para> 
    30        peut effectuer des traitements complexes, 
     30       permet d'effectuer des traitements complexes, 
    3131      </para> 
    3232     </listitem> 
     
    3939     <listitem> 
    4040      <para> 
    41        peut être défini comme digne de confiance par le serveur, 
     41       est défini comme digne de confiance par le serveur, 
    4242      </para> 
    4343     </listitem> 
     
    200200    <para> 
    201201     Les fonctions écrites en <application>PL/pgSQL</application> peuvent accepter 
    202      comme argument n'importe quel type de données supporté par le serveur, et  
     202     en argument n'importe quel type de données supporté par le serveur, et  
    203203     peuvent renvoyer un résultat de n'importe lequel de ces types. Elles peuvent 
    204204     aussi accepter ou renvoyer n'importe quel type composite (type ligne) spécifié 
     
    236236     avec des paramètres en sortie à la place de la spécification explicite 
    237237     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 retourner 
     238     langage mais c'est un moyen agréable principalement pour renvoyer 
    239239     plusieurs valeurs. 
    240240    </para> 
     
    455455     Chaque déclaration et chaque expression au sein du bloc est terminé par un 
    456456     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&nbsp;; 
     457     un point-virgule après <literal>END</literal> (voir l'exemple ci-dessus)&nbsp;; 
    458458     néanmoins, le <literal>END</literal> final qui conclut le corps d'une fonction 
    459459     n'a pas besoin de point-virgule. 
     
    517517     contrôle des transactions. Les <command>BEGIN</command>/<command>END</command> de 
    518518     <application>PL/pgSQL</application> ne servent qu'au groupement&nbsp;; ils ne débutent 
    519      ni ne terminent une transaction. Les procédures fonctions et déclencheurs 
     519     ni ne terminent une transaction. Les fonctions standards et les fonctions triggers 
    520520     sont toujours exécutées à l'intérieur d'une transaction établie par une 
    521521     requête extérieure &mdash; ils ne peuvent pas être utilisés pour commencer 
     
    536536     La seule exception est que la variable de boucle d'une boucle <literal>FOR</literal> 
    537537     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)
    539539     </para> 
    540540 
     
    546546 
    547547    <para> 
    548      Quelques exemples de déclarations de variables&nbsp;: 
     548     Quelques exemples de déclaration de variables&nbsp;: 
    549549<programlisting>id_utilisateur integer; 
    550550quantité numeric(5); 
     
    648648      <literal>$<replaceable>n</replaceable></literal> et des alias optionnels 
    649649      de la même façon que les paramètres en entrée. Un paramètre en sortie est 
    650       réellement une variable qui commence avec la valeur NULL&nbsp;; il 
     650      une variable qui commence avec la valeur NULL&nbsp;; il 
    651651      devrait se voir attribuer une valeur lors de l'exécution de la fonction. 
    652652      La valeur finale du paramètre est ce qui est renvoyée. Par exemple, 
    653       l'exemple sales-tax aurait pu être écrit de cette façon&nbsp;: 
     653      l'exemple taxe_ventes peut s'écrire de cette façon&nbsp;: 
    654654 
    655655<programlisting>CREATE FUNCTION taxe_ventes(sous_total real, OUT taxe real) AS $$ 
     
    660660</programlisting> 
    661661 
    662       Notez que nous avons omis <literal>RETURNS real</literal> &mdash; nous aurions  
     662      Notez que nous avons omis <literal>RETURNS real</literal>. Nous aurions 
    663663      pu l'inclure mais cela aura