OSDN Git Service

FIRST REPOSITORY
[eos/hostdependOTHERS.git] / I386LINUX / util / I386LINUX / doc / postgresql / html / plpgsql-control-structures.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <HTML
3 ><HEAD
4 ><TITLE
5 >Control Structures</TITLE
6 ><META
7 NAME="GENERATOR"
8 CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
9 REV="MADE"
10 HREF="mailto:pgsql-docs@postgresql.org"><LINK
11 REL="HOME"
12 TITLE="PostgreSQL 7.4.1 Documentation"
13 HREF="index.html"><LINK
14 REL="UP"
15 TITLE="PL/pgSQL - SQL Procedural Language"
16 HREF="plpgsql.html"><LINK
17 REL="PREVIOUS"
18 TITLE="Basic Statements"
19 HREF="plpgsql-statements.html"><LINK
20 REL="NEXT"
21 TITLE="Cursors"
22 HREF="plpgsql-cursors.html"><LINK
23 REL="STYLESHEET"
24 TYPE="text/css"
25 HREF="stylesheet.css"><META
26 NAME="creation"
27 CONTENT="2003-12-22T03:48:47"></HEAD
28 ><BODY
29 CLASS="SECT1"
30 ><DIV
31 CLASS="NAVHEADER"
32 ><TABLE
33 SUMMARY="Header navigation table"
34 WIDTH="100%"
35 BORDER="0"
36 CELLPADDING="0"
37 CELLSPACING="0"
38 ><TR
39 ><TH
40 COLSPAN="5"
41 ALIGN="center"
42 VALIGN="bottom"
43 >PostgreSQL 7.4.1 Documentation</TH
44 ></TR
45 ><TR
46 ><TD
47 WIDTH="10%"
48 ALIGN="left"
49 VALIGN="top"
50 ><A
51 HREF="plpgsql-statements.html"
52 ACCESSKEY="P"
53 >Prev</A
54 ></TD
55 ><TD
56 WIDTH="10%"
57 ALIGN="left"
58 VALIGN="top"
59 ><A
60 HREF="plpgsql.html"
61 >Fast Backward</A
62 ></TD
63 ><TD
64 WIDTH="60%"
65 ALIGN="center"
66 VALIGN="bottom"
67 >Chapter 37. <SPAN
68 CLASS="APPLICATION"
69 >PL/pgSQL</SPAN
70 > - <ACRONYM
71 CLASS="ACRONYM"
72 >SQL</ACRONYM
73 > Procedural Language</TD
74 ><TD
75 WIDTH="10%"
76 ALIGN="right"
77 VALIGN="top"
78 ><A
79 HREF="plpgsql.html"
80 >Fast Forward</A
81 ></TD
82 ><TD
83 WIDTH="10%"
84 ALIGN="right"
85 VALIGN="top"
86 ><A
87 HREF="plpgsql-cursors.html"
88 ACCESSKEY="N"
89 >Next</A
90 ></TD
91 ></TR
92 ></TABLE
93 ><HR
94 ALIGN="LEFT"
95 WIDTH="100%"></DIV
96 ><DIV
97 CLASS="SECT1"
98 ><H1
99 CLASS="SECT1"
100 ><A
101 NAME="PLPGSQL-CONTROL-STRUCTURES"
102 >37.7. Control Structures</A
103 ></H1
104 ><P
105 >    Control structures are probably the most useful (and
106     important) part of <SPAN
107 CLASS="APPLICATION"
108 >PL/pgSQL</SPAN
109 >. With
110     <SPAN
111 CLASS="APPLICATION"
112 >PL/pgSQL</SPAN
113 >'s control structures,
114     you can manipulate <SPAN
115 CLASS="PRODUCTNAME"
116 >PostgreSQL</SPAN
117 > data in a very
118     flexible and powerful way. 
119    </P
120 ><DIV
121 CLASS="SECT2"
122 ><H2
123 CLASS="SECT2"
124 ><A
125 NAME="PLPGSQL-STATEMENTS-RETURNING"
126 >37.7.1. Returning From a Function</A
127 ></H2
128 ><P
129 >     There are two commands available that allow you to return data
130      from a function: <TT
131 CLASS="COMMAND"
132 >RETURN</TT
133 > and <TT
134 CLASS="COMMAND"
135 >RETURN
136      NEXT</TT
137 >.
138     </P
139 ><DIV
140 CLASS="SECT3"
141 ><H3
142 CLASS="SECT3"
143 ><A
144 NAME="AEN31841"
145 >37.7.1.1. <TT
146 CLASS="COMMAND"
147 >RETURN</TT
148 ></A
149 ></H3
150 ><PRE
151 CLASS="SYNOPSIS"
152 >RETURN <VAR
153 CLASS="REPLACEABLE"
154 >expression</VAR
155 >;</PRE
156 ><P
157 >      <TT
158 CLASS="COMMAND"
159 >RETURN</TT
160 > with an expression terminates the
161       function and returns the value of
162       <VAR
163 CLASS="REPLACEABLE"
164 >expression</VAR
165 > to the caller.  This form
166       is to be used for <SPAN
167 CLASS="APPLICATION"
168 >PL/pgSQL</SPAN
169 > functions that do
170       not return a set.
171      </P
172 ><P
173 >      When returning a scalar type, any expression can be used. The
174       expression's result will be automatically cast into the
175       function's return type as described for assignments. To return a
176       composite (row) value, you must write a record or row variable
177       as the <VAR
178 CLASS="REPLACEABLE"
179 >expression</VAR
180 >.
181      </P
182 ><P
183 >      The return value of a function cannot be left undefined. If
184       control reaches the end of the top-level block of the function
185       without hitting a <TT
186 CLASS="COMMAND"
187 >RETURN</TT
188 > statement, a run-time
189       error will occur.
190      </P
191 ><P
192 >      If you have declared the function to
193       return <TT
194 CLASS="TYPE"
195 >void</TT
196 >, a <TT
197 CLASS="COMMAND"
198 >RETURN</TT
199 > statement
200       must still be specified; but in this case the expression following
201       <TT
202 CLASS="COMMAND"
203 >RETURN</TT
204 > is optional and will be ignored if present.
205      </P
206 ></DIV
207 ><DIV
208 CLASS="SECT3"
209 ><H3
210 CLASS="SECT3"
211 ><A
212 NAME="AEN31858"
213 >37.7.1.2. <TT
214 CLASS="COMMAND"
215 >RETURN NEXT</TT
216 ></A
217 ></H3
218 ><PRE
219 CLASS="SYNOPSIS"
220 >RETURN NEXT <VAR
221 CLASS="REPLACEABLE"
222 >expression</VAR
223 >;</PRE
224 ><P
225 >      When a <SPAN
226 CLASS="APPLICATION"
227 >PL/pgSQL</SPAN
228 > function is declared to return
229       <TT
230 CLASS="LITERAL"
231 >SETOF <VAR
232 CLASS="REPLACEABLE"
233 >sometype</VAR
234 ></TT
235 >, the procedure
236       to follow is slightly different.  In that case, the individual
237       items to return are specified in <TT
238 CLASS="COMMAND"
239 >RETURN NEXT</TT
240 >
241       commands, and then a final <TT
242 CLASS="COMMAND"
243 >RETURN</TT
244 > command
245       with no argument is used to indicate that the function has
246       finished executing.  <TT
247 CLASS="COMMAND"
248 >RETURN NEXT</TT
249 > can be used
250       with both scalar and composite data types; in the latter case, an
251       entire <SPAN
252 CLASS="QUOTE"
253 >"table"</SPAN
254 > of results will be returned.
255      </P
256 ><P
257 >      Functions that use <TT
258 CLASS="COMMAND"
259 >RETURN NEXT</TT
260 > should be
261       called in the following fashion:
262
263 </P><PRE
264 CLASS="PROGRAMLISTING"
265 >SELECT * FROM some_func();</PRE
266 ><P>
267
268       That is, the function is used as a table source in a <TT
269 CLASS="LITERAL"
270 >FROM</TT
271 >
272       clause.
273      </P
274 ><P
275 >      <TT
276 CLASS="COMMAND"
277 >RETURN NEXT</TT
278 > does not actually return from the
279       function; it simply saves away the value of the expression (or
280       record or row variable, as appropriate for the data type being
281       returned).  Execution then continues with the next statement in
282       the <SPAN
283 CLASS="APPLICATION"
284 >PL/pgSQL</SPAN
285 > function.  As successive
286       <TT
287 CLASS="COMMAND"
288 >RETURN NEXT</TT
289 > commands are executed, the result
290       set is built up.  A final <TT
291 CLASS="COMMAND"
292 >RETURN</TT
293 >, which should
294       have no argument, causes control to exit the function.
295      </P
296 ><DIV
297 CLASS="NOTE"
298 ><BLOCKQUOTE
299 CLASS="NOTE"
300 ><P
301 ><B
302 >Note: </B
303 >       The current implementation of <TT
304 CLASS="COMMAND"
305 >RETURN NEXT</TT
306 >
307        for <SPAN
308 CLASS="APPLICATION"
309 >PL/pgSQL</SPAN
310 > stores the entire result set
311        before returning from the function, as discussed above.  That
312        means that if a <SPAN
313 CLASS="APPLICATION"
314 >PL/pgSQL</SPAN
315 > function produces a
316        very large result set, performance may be poor: data will be
317        written to disk to avoid memory exhaustion, but the function
318        itself will not return until the entire result set has been
319        generated.  A future version of <SPAN
320 CLASS="APPLICATION"
321 >PL/pgSQL</SPAN
322 > may
323        allow users to define set-returning functions
324        that do not have this limitation.  Currently, the point at
325        which data begins being written to disk is controlled by the
326        <VAR
327 CLASS="VARNAME"
328 >sort_mem</VAR
329 > configuration variable.  Administrators
330        who have sufficient memory to store larger result sets in
331        memory should consider increasing this parameter.
332       </P
333 ></BLOCKQUOTE
334 ></DIV
335 ></DIV
336 ></DIV
337 ><DIV
338 CLASS="SECT2"
339 ><H2
340 CLASS="SECT2"
341 ><A
342 NAME="PLPGSQL-CONDITIONALS"
343 >37.7.2. Conditionals</A
344 ></H2
345 ><P
346 >     <TT
347 CLASS="LITERAL"
348 >IF</TT
349 > statements let you execute commands based on
350      certain conditions.  <SPAN
351 CLASS="APPLICATION"
352 >PL/pgSQL</SPAN
353 > has four forms of
354      <TT
355 CLASS="LITERAL"
356 >IF</TT
357 >:
358     <P
359 ></P
360 ></P><UL
361 ><LI
362 ><P
363 ><TT
364 CLASS="LITERAL"
365 >IF ... THEN</TT
366 ></P
367 ></LI
368 ><LI
369 ><P
370 ><TT
371 CLASS="LITERAL"
372 >IF ... THEN ... ELSE</TT
373 ></P
374 ></LI
375 ><LI
376 ><P
377 ><TT
378 CLASS="LITERAL"
379 >IF ... THEN ... ELSE IF</TT
380 ></P
381 ></LI
382 ><LI
383 ><P
384 ><TT
385 CLASS="LITERAL"
386 >IF ... THEN ... ELSIF ... THEN ... ELSE</TT
387 ></P
388 ></LI
389 ></UL
390 ><P>
391     </P
392 ><DIV
393 CLASS="SECT3"
394 ><H3
395 CLASS="SECT3"
396 ><A
397 NAME="AEN31906"
398 >37.7.2.1. <TT
399 CLASS="LITERAL"
400 >IF-THEN</TT
401 ></A
402 ></H3
403 ><PRE
404 CLASS="SYNOPSIS"
405 >IF <VAR
406 CLASS="REPLACEABLE"
407 >boolean-expression</VAR
408 > THEN
409     <VAR
410 CLASS="REPLACEABLE"
411 >statements</VAR
412 >
413 END IF;</PRE
414 ><P
415 >        <TT
416 CLASS="LITERAL"
417 >IF-THEN</TT
418 > statements are the simplest form of
419         <TT
420 CLASS="LITERAL"
421 >IF</TT
422 >. The statements between
423         <TT
424 CLASS="LITERAL"
425 >THEN</TT
426 > and <TT
427 CLASS="LITERAL"
428 >END IF</TT
429 > will be
430         executed if the condition is true. Otherwise, they are
431         skipped.
432        </P
433 ><P
434 >        Example:
435 </P><PRE
436 CLASS="PROGRAMLISTING"
437 >IF v_user_id &lt;&gt; 0 THEN
438     UPDATE users SET email = v_email WHERE user_id = v_user_id;
439 END IF;</PRE
440 ><P>
441        </P
442 ></DIV
443 ><DIV
444 CLASS="SECT3"
445 ><H3
446 CLASS="SECT3"
447 ><A
448 NAME="AEN31919"
449 >37.7.2.2. <TT
450 CLASS="LITERAL"
451 >IF-THEN-ELSE</TT
452 ></A
453 ></H3
454 ><PRE
455 CLASS="SYNOPSIS"
456 >IF <VAR
457 CLASS="REPLACEABLE"
458 >boolean-expression</VAR
459 > THEN
460     <VAR
461 CLASS="REPLACEABLE"
462 >statements</VAR
463 >
464 ELSE
465     <VAR
466 CLASS="REPLACEABLE"
467 >statements</VAR
468 >
469 END IF;</PRE
470 ><P
471 >        <TT
472 CLASS="LITERAL"
473 >IF-THEN-ELSE</TT
474 > statements add to
475         <TT
476 CLASS="LITERAL"
477 >IF-THEN</TT
478 > by letting you specify an
479         alternative set of statements that should be executed if the
480         condition evaluates to false.
481        </P
482 ><P
483 >        Examples:
484 </P><PRE
485 CLASS="PROGRAMLISTING"
486 >IF parentid IS NULL OR parentid = ''''
487 THEN
488     RETURN fullname;
489 ELSE
490     RETURN hp_true_filename(parentid) || ''/'' || fullname;
491 END IF;</PRE
492 ><P>
493
494 </P><PRE
495 CLASS="PROGRAMLISTING"
496 >IF v_count &#62; 0 THEN 
497     INSERT INTO users_count (count) VALUES (v_count);
498     RETURN ''t'';
499 ELSE
500     RETURN ''f'';
501 END IF;</PRE
502 ><P>
503      </P
504 ></DIV
505 ><DIV
506 CLASS="SECT3"
507 ><H3
508 CLASS="SECT3"
509 ><A
510 NAME="AEN31932"
511 >37.7.2.3. <TT
512 CLASS="LITERAL"
513 >IF-THEN-ELSE IF</TT
514 ></A
515 ></H3
516 ><P
517 >        <TT
518 CLASS="LITERAL"
519 >IF</TT
520 > statements can be nested, as in the
521         following example:
522
523 </P><PRE
524 CLASS="PROGRAMLISTING"
525 >IF demo_row.sex = ''m'' THEN
526     pretty_sex := ''man'';
527 ELSE
528     IF demo_row.sex = ''f'' THEN
529         pretty_sex := ''woman'';
530     END IF;
531 END IF;</PRE
532 ><P>
533        </P
534 ><P
535 >        When you use this form, you are actually nesting an
536         <TT
537 CLASS="LITERAL"
538 >IF</TT
539 > statement inside the
540         <TT
541 CLASS="LITERAL"
542 >ELSE</TT
543 > part of an outer <TT
544 CLASS="LITERAL"
545 >IF</TT
546 >
547         statement. Thus you need one <TT
548 CLASS="LITERAL"
549 >END IF</TT
550 >
551         statement for each nested <TT
552 CLASS="LITERAL"
553 >IF</TT
554 > and one for the parent
555         <TT
556 CLASS="LITERAL"
557 >IF-ELSE</TT
558 >.  This is workable but grows
559         tedious when there are many alternatives to be checked.
560         Hence the next form.
561        </P
562 ></DIV
563 ><DIV
564 CLASS="SECT3"
565 ><H3
566 CLASS="SECT3"
567 ><A
568 NAME="AEN31945"
569 >37.7.2.4. <TT
570 CLASS="LITERAL"
571 >IF-THEN-ELSIF-ELSE</TT
572 ></A
573 ></H3
574 ><PRE
575 CLASS="SYNOPSIS"
576 >IF <VAR
577 CLASS="REPLACEABLE"
578 >boolean-expression</VAR
579 > THEN
580     <VAR
581 CLASS="REPLACEABLE"
582 >statements</VAR
583 >
584 [<SPAN
585 CLASS="OPTIONAL"
586 > ELSIF <VAR
587 CLASS="REPLACEABLE"
588 >boolean-expression</VAR
589 > THEN
590     <VAR
591 CLASS="REPLACEABLE"
592 >statements</VAR
593 >
594 [<SPAN
595 CLASS="OPTIONAL"
596 > ELSIF <VAR
597 CLASS="REPLACEABLE"
598 >boolean-expression</VAR
599 > THEN
600     <VAR
601 CLASS="REPLACEABLE"
602 >statements</VAR
603 >
604     ...</SPAN
605 >]</SPAN
606 >]
607 [<SPAN
608 CLASS="OPTIONAL"
609 > ELSE
610     <VAR
611 CLASS="REPLACEABLE"
612 >statements</VAR
613 > </SPAN
614 >]
615 END IF;</PRE
616 ><P
617 >        <TT
618 CLASS="LITERAL"
619 >IF-THEN-ELSIF-ELSE</TT
620 > provides a more convenient
621         method of checking many alternatives in one statement.
622         Formally it is equivalent to nested
623         <TT
624 CLASS="LITERAL"
625 >IF-THEN-ELSE-IF-THEN</TT
626 > commands, but only one
627         <TT
628 CLASS="LITERAL"
629 >END IF</TT
630 > is needed.
631        </P
632 ><P
633 >        Here is an example:
634
635 </P><PRE
636 CLASS="PROGRAMLISTING"
637 >IF number = 0 THEN
638     result := ''zero'';
639 ELSIF number &gt; 0 THEN 
640     result := ''positive'';
641 ELSIF number &lt; 0 THEN
642     result := ''negative'';
643 ELSE
644     -- hmm, the only other possibility is that number is null
645     result := ''NULL'';
646 END IF;</PRE
647 ><P>
648        </P
649 ></DIV
650 ></DIV
651 ><DIV
652 CLASS="SECT2"
653 ><H2
654 CLASS="SECT2"
655 ><A
656 NAME="PLPGSQL-CONTROL-STRUCTURES-LOOPS"
657 >37.7.3. Simple Loops</A
658 ></H2
659 ><A
660 NAME="AEN31967"
661 ></A
662 ><P
663 >     With the <TT
664 CLASS="LITERAL"
665 >LOOP</TT
666 >, <TT
667 CLASS="LITERAL"
668 >EXIT</TT
669 >, <TT
670 CLASS="LITERAL"
671 >WHILE</TT
672 >,
673      and <TT
674 CLASS="LITERAL"
675 >FOR</TT
676 > statements, you can arrange for your
677      <SPAN
678 CLASS="APPLICATION"
679 >PL/pgSQL</SPAN
680 > function to repeat a series
681      of commands.
682     </P
683 ><DIV
684 CLASS="SECT3"
685 ><H3
686 CLASS="SECT3"
687 ><A
688 NAME="AEN31976"
689 >37.7.3.1. <TT
690 CLASS="LITERAL"
691 >LOOP</TT
692 ></A
693 ></H3
694 ><PRE
695 CLASS="SYNOPSIS"
696 >[<SPAN
697 CLASS="OPTIONAL"
698 >&lt;&lt;<VAR
699 CLASS="REPLACEABLE"
700 >label</VAR
701 >&gt;&gt;</SPAN
702 >]
703 LOOP
704     <VAR
705 CLASS="REPLACEABLE"
706 >statements</VAR
707 >
708 END LOOP;</PRE
709 ><P
710 >      <TT
711 CLASS="LITERAL"
712 >LOOP</TT
713 > defines an unconditional loop that is repeated indefinitely
714       until terminated by an <TT
715 CLASS="LITERAL"
716 >EXIT</TT
717 > or <TT
718 CLASS="COMMAND"
719 >RETURN</TT
720 >
721       statement.  The optional label can be used by <TT
722 CLASS="LITERAL"
723 >EXIT</TT
724 > statements in
725       nested loops to specify which level of nesting should be
726       terminated.
727      </P
728 ></DIV
729 ><DIV
730 CLASS="SECT3"
731 ><H3
732 CLASS="SECT3"
733 ><A
734 NAME="AEN31988"
735 >37.7.3.2. <TT
736 CLASS="LITERAL"
737 >EXIT</TT
738 ></A
739 ></H3
740 ><PRE
741 CLASS="SYNOPSIS"
742 >EXIT [<SPAN
743 CLASS="OPTIONAL"
744 > <VAR
745 CLASS="REPLACEABLE"
746 >label</VAR
747 > </SPAN
748 >] [<SPAN
749 CLASS="OPTIONAL"
750 > WHEN <VAR
751 CLASS="REPLACEABLE"
752 >expression</VAR
753 > </SPAN
754 >];</PRE
755 ><P
756 >        If no <VAR
757 CLASS="REPLACEABLE"
758 >label</VAR
759 > is given,
760         the innermost loop is terminated and the
761         statement following <TT
762 CLASS="LITERAL"
763 >END LOOP</TT
764 > is executed next.
765         If <VAR
766 CLASS="REPLACEABLE"
767 >label</VAR
768 > is given, it
769         must be the label of the current or some outer level of nested loop
770         or block. Then the named loop or block is terminated and control
771         continues with the statement after the loop's/block's corresponding
772         <TT
773 CLASS="LITERAL"
774 >END</TT
775 >.
776        </P
777 ><P
778 >        If <TT
779 CLASS="LITERAL"
780 >WHEN</TT
781 > is present, loop exit occurs only if the specified condition
782         is true, otherwise control passes to the statement after <TT
783 CLASS="LITERAL"
784 >EXIT</TT
785 >.
786        </P
787 ><P
788 >        Examples:
789 </P><PRE
790 CLASS="PROGRAMLISTING"
791 >LOOP
792     -- some computations
793     IF count &gt; 0 THEN
794         EXIT;  -- exit loop
795     END IF;
796 END LOOP;
797
798 LOOP
799     -- some computations
800     EXIT WHEN count &gt; 0;  -- same result as previous example
801 END LOOP;
802
803 BEGIN
804     -- some computations
805     IF stocks &gt; 100000 THEN
806         EXIT;  -- invalid; cannot use EXIT outside of LOOP
807     END IF;
808 END;</PRE
809 ><P>
810        </P
811 ></DIV
812 ><DIV
813 CLASS="SECT3"
814 ><H3
815 CLASS="SECT3"
816 ><A
817 NAME="AEN32006"
818 >37.7.3.3. <TT
819 CLASS="LITERAL"
820 >WHILE</TT
821 ></A
822 ></H3
823 ><PRE
824 CLASS="SYNOPSIS"
825 >[<SPAN
826 CLASS="OPTIONAL"
827 >&lt;&lt;<VAR
828 CLASS="REPLACEABLE"
829 >label</VAR
830 >&gt;&gt;</SPAN
831 >]
832 WHILE <VAR
833 CLASS="REPLACEABLE"
834 >expression</VAR
835 > LOOP
836     <VAR
837 CLASS="REPLACEABLE"
838 >statements</VAR
839 >
840 END LOOP;</PRE
841 ><P
842 >        The <TT
843 CLASS="LITERAL"
844 >WHILE</TT
845 > statement repeats a
846         sequence of statements so long as the condition expression
847         evaluates to true.  The condition is checked just before
848         each entry to the loop body.
849        </P
850 ><P
851 >        For example:
852 </P><PRE
853 CLASS="PROGRAMLISTING"
854 >WHILE amount_owed &gt; 0 AND gift_certificate_balance &gt; 0 LOOP
855     -- some computations here
856 END LOOP;
857
858 WHILE NOT boolean_expression LOOP
859     -- some computations here
860 END LOOP;</PRE
861 ><P>
862        </P
863 ></DIV
864 ><DIV
865 CLASS="SECT3"
866 ><H3
867 CLASS="SECT3"
868 ><A
869 NAME="AEN32018"
870 >37.7.3.4. <TT
871 CLASS="LITERAL"
872 >FOR</TT
873 > (integer variant)</A
874 ></H3
875 ><PRE
876 CLASS="SYNOPSIS"
877 >[<SPAN
878 CLASS="OPTIONAL"
879 >&lt;&lt;<VAR
880 CLASS="REPLACEABLE"
881 >label</VAR
882 >&gt;&gt;</SPAN
883 >]
884 FOR <VAR
885 CLASS="REPLACEABLE"
886 >name</VAR
887 > IN [<SPAN
888 CLASS="OPTIONAL"
889 > REVERSE </SPAN
890 >] <VAR
891 CLASS="REPLACEABLE"
892 >expression</VAR
893 > .. <VAR
894 CLASS="REPLACEABLE"
895 >expression</VAR
896 > LOOP
897     <VAR
898 CLASS="REPLACEABLE"
899 >statements</VAR
900 >
901 END LOOP;</PRE
902 ><P
903 >        This form of <TT
904 CLASS="LITERAL"
905 >FOR</TT
906 > creates a loop that iterates over a range of integer
907         values. The variable 
908         <VAR
909 CLASS="REPLACEABLE"
910 >name</VAR
911 > is automatically defined as type
912         <TT
913 CLASS="TYPE"
914 >integer</TT
915 > and exists only inside the loop. The two expressions giving
916         the lower and upper bound of the range are evaluated once when entering
917         the loop. The iteration step is normally 1, but is -1 when <TT
918 CLASS="LITERAL"
919 >REVERSE</TT
920 > is
921         specified.
922        </P
923 ><P
924 >        Some examples of integer <TT
925 CLASS="LITERAL"
926 >FOR</TT
927 > loops:
928 </P><PRE
929 CLASS="PROGRAMLISTING"
930 >FOR i IN 1..10 LOOP
931     -- some computations here
932     RAISE NOTICE ''i is %'', i;
933 END LOOP;
934
935 FOR i IN REVERSE 10..1 LOOP
936     -- some computations here
937 END LOOP;</PRE
938 ><P>
939        </P
940 ><P
941 >        If the lower bound is greater than the upper bound (or less than,
942         in the <TT
943 CLASS="LITERAL"
944 >REVERSE</TT
945 > case), the loop body is not
946         executed at all.  No error is raised.
947        </P
948 ></DIV
949 ></DIV
950 ><DIV
951 CLASS="SECT2"
952 ><H2
953 CLASS="SECT2"
954 ><A
955 NAME="PLPGSQL-RECORDS-ITERATING"
956 >37.7.4. Looping Through Query Results</A
957 ></H2
958 ><P
959 >     Using a different type of <TT
960 CLASS="LITERAL"
961 >FOR</TT
962 > loop, you can iterate through
963      the results of a query and manipulate that data
964      accordingly. The syntax is:
965 </P><PRE
966 CLASS="SYNOPSIS"
967 >[<SPAN
968 CLASS="OPTIONAL"
969 >&lt;&lt;<VAR
970 CLASS="REPLACEABLE"
971 >label</VAR
972 >&gt;&gt;</SPAN
973 >]
974 FOR <VAR
975 CLASS="REPLACEABLE"
976 >record_or_row</VAR
977 > IN <VAR
978 CLASS="REPLACEABLE"
979 >query</VAR
980 > LOOP
981     <VAR
982 CLASS="REPLACEABLE"
983 >statements</VAR
984 >
985 END LOOP;</PRE
986 ><P>
987      The record or row variable is successively assigned each row
988      resulting from the query (a <TT
989 CLASS="COMMAND"
990 >SELECT</TT
991 > command) and the loop
992      body is executed for each row. Here is an example:
993 </P><PRE
994 CLASS="PROGRAMLISTING"
995 >CREATE FUNCTION cs_refresh_mviews() RETURNS integer AS '
996 DECLARE
997     mviews RECORD;
998 BEGIN
999     PERFORM cs_log(''Refreshing materialized views...'');
1000
1001     FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP
1002
1003         -- Now "mviews" has one record from cs_materialized_views
1004
1005         PERFORM cs_log(''Refreshing materialized view '' || quote_ident(mviews.mv_name) || ''...'');
1006         EXECUTE ''TRUNCATE TABLE  '' || quote_ident(mviews.mv_name);
1007         EXECUTE ''INSERT INTO '' || quote_ident(mviews.mv_name) || '' '' || mviews.mv_query;
1008     END LOOP;
1009
1010     PERFORM cs_log(''Done refreshing materialized views.'');
1011     RETURN 1;
1012 END;
1013 ' LANGUAGE plpgsql;</PRE
1014 ><P>
1015
1016      If the loop is terminated by an <TT
1017 CLASS="LITERAL"
1018 >EXIT</TT
1019 > statement, the last
1020      assigned row value is still accessible after the loop.
1021     </P
1022 ><P
1023 >     The <TT
1024 CLASS="LITERAL"
1025 >FOR-IN-EXECUTE</TT
1026 > statement is another way to iterate over
1027      records:
1028 </P><PRE
1029 CLASS="SYNOPSIS"
1030 >[<SPAN
1031 CLASS="OPTIONAL"
1032 >&lt;&lt;<VAR
1033 CLASS="REPLACEABLE"
1034 >label</VAR
1035 >&gt;&gt;</SPAN
1036 >]
1037 FOR <VAR
1038 CLASS="REPLACEABLE"
1039 >record_or_row</VAR
1040 > IN EXECUTE <VAR
1041 CLASS="REPLACEABLE"
1042 >text_expression</VAR
1043 > LOOP 
1044     <VAR
1045 CLASS="REPLACEABLE"
1046 >statements</VAR
1047 >
1048 END LOOP;</PRE
1049 ><P>
1050      This is like the previous form, except that the source
1051      <TT
1052 CLASS="COMMAND"
1053 >SELECT</TT
1054 > statement is specified as a string
1055      expression, which is evaluated and replanned on each entry to
1056      the <TT
1057 CLASS="LITERAL"
1058 >FOR</TT
1059 > loop.  This allows the programmer to choose the speed of
1060      a preplanned query or the flexibility of a dynamic query, just
1061      as with a plain <TT
1062 CLASS="COMMAND"
1063 >EXECUTE</TT
1064 > statement.
1065     </P
1066 ><DIV
1067 CLASS="NOTE"
1068 ><BLOCKQUOTE
1069 CLASS="NOTE"
1070 ><P
1071 ><B
1072 >Note: </B
1073 >     The <SPAN
1074 CLASS="APPLICATION"
1075 >PL/pgSQL</SPAN
1076 > parser presently distinguishes the
1077      two kinds of <TT
1078 CLASS="LITERAL"
1079 >FOR</TT
1080 > loops (integer or query result) by checking
1081      whether the target variable mentioned just after <TT
1082 CLASS="LITERAL"
1083 >FOR</TT
1084 > has been
1085      declared as a record or row variable.  If not, it's presumed to be
1086      an integer <TT
1087 CLASS="LITERAL"
1088 >FOR</TT
1089 > loop.  This can cause rather nonintuitive error
1090      messages when the true problem is, say, that one has
1091      misspelled the variable name after the <TT
1092 CLASS="LITERAL"
1093 >FOR</TT
1094 >.  Typically
1095      the complaint will be something like <TT
1096 CLASS="LITERAL"
1097 >missing ".." at end of SQL
1098      expression</TT
1099 >.
1100     </P
1101 ></BLOCKQUOTE
1102 ></DIV
1103 ></DIV
1104 ></DIV
1105 ><DIV
1106 CLASS="NAVFOOTER"
1107 ><HR
1108 ALIGN="LEFT"
1109 WIDTH="100%"><TABLE
1110 SUMMARY="Footer navigation table"
1111 WIDTH="100%"
1112 BORDER="0"
1113 CELLPADDING="0"
1114 CELLSPACING="0"
1115 ><TR
1116 ><TD
1117 WIDTH="33%"
1118 ALIGN="left"
1119 VALIGN="top"
1120 ><A
1121 HREF="plpgsql-statements.html"
1122 ACCESSKEY="P"
1123 >Prev</A
1124 ></TD
1125 ><TD
1126 WIDTH="34%"
1127 ALIGN="center"
1128 VALIGN="top"
1129 ><A
1130 HREF="index.html"
1131 ACCESSKEY="H"
1132 >Home</A
1133 ></TD
1134 ><TD
1135 WIDTH="33%"
1136 ALIGN="right"
1137 VALIGN="top"
1138 ><A
1139 HREF="plpgsql-cursors.html"
1140 ACCESSKEY="N"
1141 >Next</A
1142 ></TD
1143 ></TR
1144 ><TR
1145 ><TD
1146 WIDTH="33%"
1147 ALIGN="left"
1148 VALIGN="top"
1149 >Basic Statements</TD
1150 ><TD
1151 WIDTH="34%"
1152 ALIGN="center"
1153 VALIGN="top"
1154 ><A
1155 HREF="plpgsql.html"
1156 ACCESSKEY="U"
1157 >Up</A
1158 ></TD
1159 ><TD
1160 WIDTH="33%"
1161 ALIGN="right"
1162 VALIGN="top"
1163 >Cursors</TD
1164 ></TR
1165 ></TABLE
1166 ></DIV
1167 ></BODY
1168 ></HTML
1169 >