Skip to content

Commit

Permalink
Quelques corrections
Browse files Browse the repository at this point in the history
  • Loading branch information
gleu committed Jun 23, 2013
1 parent f7f33fb commit 0d97891
Showing 1 changed file with 49 additions and 43 deletions.
92 changes: 49 additions & 43 deletions postgresql/xfunc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,8 @@
</para>

<para>
Une fonction SQL peut être déclarée de façon à renvoyer un ensemble (<quote>set</quote>, ce qui signifie de multiples lignes)
Une fonction SQL peut être déclarée de façon à renvoyer un ensemble
(<quote>set</quote>, ce qui signifie un ensemble de lignes)
en spécifiant le type renvoyé par la fonction comme <literal>SETOF
<replaceable>un_type</replaceable></literal>, ou de façon équivalente en
la déclarant comme <literal>RETURNS
Expand Down Expand Up @@ -903,13 +904,13 @@ SELECT * FROM sum_n_product_with_tab(10);
</para>

<para>
Il est souvent utile de construire le résultat d'une requête par l'appel répété
d'une fonction retournant un ensemble, dont les paramètres de chaque appel varient
avec les valeurs des lignes d'une table ou d'une sous-requête. La manière idéale
de le réaliser est d'utiliser le mot clé <literal>LATERAL</literal>,
qui est décrit dans <xref linkend="queries-lateral"/>.
Voici un exemple de fonction retournant un ensemble permettant d'énumérer
les éléments d'une structure en arbre :
Il est souvent utile de construire le résultat d'une requête par l'appel
répété d'une fonction retournant un ensemble, dont les paramètres varient à
chaque appel avec les valeurs des lignes d'une table ou d'une sous-requête.
La manière idéale de le réaliser est d'utiliser le mot clé
<literal>LATERAL</literal>, qui est décrit dans <xref
linkend="queries-lateral"/>. Voici un exemple de fonction retournant un
ensemble permettant d'énumérer les éléments d'une structure en arbre&nbsp;:

<screen>SELECT * FROM noeuds;
nom | parent
Expand Down Expand Up @@ -946,18 +947,20 @@ SELECT nom, enfant FROM noeuds, LATERAL listeenfant(nom) AS enfant;
</screen>

Cet exemple ne fait rien de plus que ce qui aurait été possible avec
une simple jointure, mais dans des cas plus compliqués l'alternative
consistant à reporter du travail dans une fonction peut se révéler assez pratique.
une simple jointure mais, dans des cas plus complexes, l'alternative
consistant à reporter du travail dans une fonction peut se révéler assez
pratique.
</para>

<para>
Actuellement, les fonctions retournant des ensembles peuvent aussi être appelées
dans la clause select d'une requête. Pour chaque ligne que cette requête génére
par elle-même, la fonction retournant un ensemble est invoquée, et une ligne-résultat
est générée pour chaque élément de l'ensemble retourné par la fonction. A noter
cependant que cette fonctionnalité est dépréciée et devrait être supprimée dans
les prochaines versions. L'exemple précédent peut aussi être implémenté avec des
requêtes telles que:
Actuellement, les fonctions retournant des ensembles peuvent aussi être
appelées dans la clause select d'une requête. Pour chaque ligne que cette
requête génère par elle-même, la fonction retournant un ensemble est
appelée, et une ligne résultat est générée pour chaque élément de l'ensemble
retourné par la fonction. Cependant, il est à noter que cette fonctionnalité
est dépréciée et devrait être supprimée dans les prochaines versions.
L'exemple précédent peut aussi être implémenté avec des requêtes telles
que&nbsp;:

<screen>

Expand All @@ -981,11 +984,12 @@ SELECT nom, listeenfant(nom) FROM noeuds;
</screen>

Notez, dans le dernier <command>SELECT</command>, qu'aucune ligne n'est
renvoyée pour <literal>Enfant2</literal>, <literal>Enfant3</literal>, etc. C'est parce
que la fonction <function>listeenfant</function> renvoie un ensemble vide
pour ces arguments et ainsi aucune ligne n'est générée. Ce comportement
est le même que celui attendu par une requête inner join avec le résultat
de la fonction en utilisant la syntaxe <literal>LATERAL</literal>.
renvoyée pour <literal>Enfant2</literal>, <literal>Enfant3</literal>, etc.
Ceci est dû au fait que la fonction <function>listeenfant</function>
renvoie un ensemble vide pour ces arguments et ainsi aucune ligne n'est
générée. Ce comportement est identique à celui attendu par une requête de
jointure interne join avec le résultat de la fonction utilisant la syntaxe
<literal>LATERAL</literal>.
</para>

<note>
Expand All @@ -1004,14 +1008,16 @@ SELECT nom, listeenfant(nom) FROM noeuds;

<note>
<para>
Le principal problème lorsque l'on utiliser une fonction retournant une liste
dans la clause <literal>SELECT</literal> plutôt que dans la clause <literal>FROM</literal>,
est que l'ajout de plus d'une fonction retournant un ensemble dans la même clause <literal>SELECT</literal>
ne se comporte pas correctement (ce que nous obtenons actuellement est une liste
dont la taille est le plus petit commun multiple du nombre de ligne produites
par chaque fonction retournant un ensemble.) La syntaxe <literal>LATERAL</literal>
génére un résulant moins surprenant avec de multiples fonctions retournant des ensembles,
et devrait préférentiellement être utilisée.
Le problème principal lors de l'utilisation d'une fonction renvoyant une
liste dans la clause <literal>SELECT</literal> plutôt que dans la clause
<literal>FROM</literal> est que l'ajout de plus d'une fonction retournant
un ensemble dans la même clause <literal>SELECT</literal> ne se comporte
pas correctement (ce que nous obtenons actuellement est une liste dont la
taille est le plus petit commun multiple du nombre de lignes produites par
chaque fonction renvoyant un ensemble). La syntaxe
<literal>LATERAL</literal> génère un résulant moins surprenant avec de
multiples fonctions renvoyant des ensembles, et devrait préférentiellement
être utilisée.
</para>
</note>
</sect2>
Expand Down Expand Up @@ -1809,13 +1815,12 @@ PG_MODULE_MAGIC;
typedef int int4;
</programlisting>

(le vrai code C de PostgreSQL appelle ce type <type>int32</type> car il
(le code C de PostgreSQL appelle ce type <type>int32</type> car il
existe une convention en C disant que <type>int<replaceable>XX</replaceable></type>
signifie <replaceable>XX</replaceable> <emphasis>bits</emphasis>. A noter aussi
toutefois que le type C <type>int8</type> a une taille d'un byte. Le type SQL
<type>int8</type> est appelé <type>int64</type> en C. Voir aussi
<xref linkend="xfunc-c-type-table"/>.)

signifie <replaceable>XX</replaceable> <emphasis>bits</emphasis>. Il est
à noter toutefois que le type C <type>int8</type> a une taille d'un octet.
Le type SQL <type>int8</type> est appelé <type>int64</type> en C. Voir
aussi <xref linkend="xfunc-c-type-table"/>.)
</para>

<para>
Expand Down Expand Up @@ -3166,10 +3171,10 @@ CREATE OR REPLACE FUNCTION retcomposite(integer, integer)
<literal>fcinfo-&gt;flinfo</literal>. Le paramètre <literal>argnum</literal> est basé à
partir de zéro. <function>get_call_result_type</function> peut aussi être utilisé
comme alternative à <function>get_fn_expr_rettype</function>.
Il existe aussi une fonction <function>get_fn_expr_variadic</function>, qui peut être utilisée pour
savoir si l'appel contient explicitement un mot clé <literal>VARIADIC</literal>.
Cela peut être réellement utile pour les fonctions <literal>VARIADIC "any"</literal>,
comme décrit plus bas.
Il existe aussi une fonction <function>get_fn_expr_variadic</function>,
qui peut être utilisée pour savoir si l'appel contient explicitement un mot
clé <literal>VARIADIC</literal>. Cela peut être réellement utile pour les
fonctions <literal>VARIADIC "any"</literal>, comme décrit ci-dessous.
</para>

<para>
Expand Down Expand Up @@ -3255,9 +3260,10 @@ make_array(PG_FUNCTION_ARGS)
fonctionnalité. Ainsi, les utilisateurs d'une telle fonction voudront
probablement utilisé le mot-clé <literal>VARIADIC</literal> dans leur
appel de fonction, de manière à ce que la fonction traite les éléments
du tableau comme des arguments séparés. La fonction elle-même doit implémenter
ce comportement si nécessaire, après avoir utilisé <function>get_fn_expr_variadic</function> pour
savoir si les arguments actuels ont été marqué avec <literal>VARIADIC</literal>.
du tableau comme des arguments séparés. La fonction elle-même doit
implémenter ce comportement si nécessaire, après avoir utilisé
<function>get_fn_expr_variadic</function> pour savoir si les arguments
actuels ont été marqué avec <literal>VARIADIC</literal>.
</para>
</sect2>

Expand Down

0 comments on commit 0d97891

Please sign in to comment.