<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=P%C5%99%C3%ADkazy_cyklu</id>
	<title>Příkazy cyklu - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=P%C5%99%C3%ADkazy_cyklu"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=P%C5%99%C3%ADkazy_cyklu&amp;action=history"/>
	<updated>2026-06-02T19:42:55Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=P%C5%99%C3%ADkazy_cyklu&amp;diff=225&amp;oldid=prev</id>
		<title>imported&gt;WikiSysop v 8. 2. 2007, 07:07</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=P%C5%99%C3%ADkazy_cyklu&amp;diff=225&amp;oldid=prev"/>
		<updated>2007-02-08T07:07:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== Příkaz LOOP ===&lt;br /&gt;
Cyklus &amp;#039;&amp;#039;LOOP ... END LOOP&amp;#039;&amp;#039; je nejjednodušší příkazem cyklu. Sám o sobě představuje nekonečný cyklus a k jeho opuštění je nutné použít příkaz &amp;#039;&amp;#039;LEAVE&amp;#039;&amp;#039;. Příkaz &amp;#039;&amp;#039;LEAVE&amp;#039;&amp;#039; si&lt;br /&gt;
vynucuje návěstí, tudíž pokud nepředpokládáme, že cyklus opustíme příkazy &amp;#039;&amp;#039;RETURN&amp;#039;&amp;#039; nebo &amp;#039;&amp;#039;SIGNAL&amp;#039;&amp;#039; musí mít příkaz LOOP vždy návěstí.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Syntaxe&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [navesti &amp;#039;:&amp;#039; ]&lt;br /&gt;
  LOOP&lt;br /&gt;
    (seznam sql/psm prikazu)&lt;br /&gt;
  END LOOP [navesti]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz WHILE ===&lt;br /&gt;
Cyklus &amp;#039;&amp;#039;WHILE..END WHILE&amp;#039;&amp;#039; zajistí opakované provádění bloku SQL příkazů v případě, že zadaný výraz je pravdivý. V případě, že výraz je neplatný již při zahájení příkazu, tělo cyklu se neprovede ani jednou. Ukázka obsahuje výpočet funkce &amp;#039;&amp;#039;faktoriál&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION factorial(n int)&lt;br /&gt;
RETURNS int8 AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE f int8 DEFAULT 1;&lt;br /&gt;
    DECLARE counter integer = n;&lt;br /&gt;
    factorial_loop:&lt;br /&gt;
    WHILE counter &amp;gt; 1 DO&lt;br /&gt;
      SET f = f * counter;&lt;br /&gt;
      SET counter = counter - 1;&lt;br /&gt;
    END WHILE;&lt;br /&gt;
    RETURN f;&lt;br /&gt;
  END;&lt;br /&gt;
$$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Syntaxe&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [navesti &amp;#039;:&amp;#039;]&lt;br /&gt;
  WHILE podminka DO&lt;br /&gt;
    (seznam SQL/PSM prikazu)&lt;br /&gt;
  END WHILE [navesti]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz REPEAT ===&lt;br /&gt;
Příkaz &amp;#039;&amp;#039;REPEAT UNTIL END REPEAT&amp;#039;&amp;#039; zajistí minimálně jednou vyhodnocení těla cyklu. Cyklus se opouští tehdy, pokud je podmínka splněna. Uvnitř těla cyklu lze použít příkazy LEAVE a ITERATE. Při nevhodném použití příkazu ITERATE hrozí nekonečný cyklus, neboť se obchází testování podmínky. Následující příkaz vypíše obsah tabulky.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION rt()&lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE a, b integer;&lt;br /&gt;
    DECLARE sqlstate char(5);&lt;br /&gt;
    DECLARE c CURSOR FOR SELECT * FROM Foo;&lt;br /&gt;
    OPEN c;&lt;br /&gt;
    REPEAT&lt;br /&gt;
      FETCH c INTO a, b;&lt;br /&gt;
      IF sqlstate = &amp;#039;00000&amp;#039; THEN&lt;br /&gt;
        PRINT a, b;&lt;br /&gt;
      END IF;&lt;br /&gt;
    UNTIL sqlstate &amp;lt;&amp;gt; &amp;#039;00000&amp;#039; END REPEAT;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Syntaxe&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [navesti &amp;#039;:&amp;#039;]&lt;br /&gt;
  REPEAT&lt;br /&gt;
    (seznam SQL/PSM prikazu)&lt;br /&gt;
  UNTIL logicky vyraz END REPEAT [navesti]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz FOR ===&lt;br /&gt;
Jednou z předchozích ukázek byla iterace napříč výsledkem dotazu pomocí explicitně deklarovaného kurzoru. Nejedná se o nijak komplikovaný vzor. Musíme být pouze opatrní při vnořené iteraci několika kurzory. Tuto činnost lze ještě zjednodušit použitím příkazu &amp;#039;&amp;#039;FOR&amp;#039;&amp;#039;. Tento příkaz zajistí vytvoření kurzoru, jeho otevření, deklaraci potřebných lokálních proměnných (s viditelností omezenou příkazem &amp;#039;&amp;#039;FOR&amp;#039;&amp;#039;) odpovídajících sloupcům kurzoru i opakované plnění těchto proměnných příkazem &amp;#039;&amp;#039;FETCH&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Syntaxe&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [navesti &amp;#039;:&amp;#039; ]&lt;br /&gt;
  FOR [ jmennny prostor AS ]&lt;br /&gt;
      [ nazev kurzoru  CURSOR FOR ]  SQL dotaz&lt;br /&gt;
  DO  &lt;br /&gt;
    (seznam sql/psm prikazu)&lt;br /&gt;
  END FOR [ navesti ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Příkaz FOR detekuje názvy a typy atributu v SQL dotazu a vytvoří odpovídající proměnné (se stejným názvem a typem) v zadaném jmenném prostoru. Tyto proměnné jsou v každé iteraci příkazu naplněny aktuální hodnotou kurzoru. Pokud neuvedeme název kurzoru, použije se nepojmenovaný kurzor. Pokud je název zadaný, vytvoří se pojmenovaný kurzor s zadaným názvem. Pojmenovat kurzor má smysl pouze v tom případě, že v těle příkazu &amp;#039;&amp;#039;FOR&amp;#039;&amp;#039; použijeme příkaz &amp;#039;&amp;#039;DELETE WHERE CURRENT OF&amp;#039;&amp;#039; název kurzoru nebo &amp;#039;&amp;#039;UPDATE WHERE CURRENT OF&amp;#039;&amp;#039; název kurzoru. To ale předpokládá, PostgreSQL zatím nepodporované, aktualizovatelné kurzory. Stejně jako ve všech ostatních příkazech opakování (cyklů) lze provádění příkazu přerušit překazem &amp;#039;&amp;#039;LEAVE&amp;#039;&amp;#039; nebo přejít na další řádek kurzoru příkazem &amp;#039;&amp;#039;ITERATE&amp;#039;&amp;#039;. K tomu ale musí mít příkaz &amp;#039;&amp;#039;FOR&amp;#039;&amp;#039; určeno návěstí.&lt;br /&gt;
&lt;br /&gt;
V příkladu je příkaz &amp;#039;&amp;#039;FOR&amp;#039;&amp;#039; použitý k zobrazení vzestupné řady sudých čísel v intervalu 0..20:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo()&lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$ &lt;br /&gt;
  FOR ns AS &lt;br /&gt;
      SELECT g.i FROM generate_series(0, 10) g(i)&lt;br /&gt;
  DO&lt;br /&gt;
    PRINT ns.i * 2;&lt;br /&gt;
  END FOR;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkazy LEAVE a ITERATE ===&lt;br /&gt;
Všechny podporované příkazy cyklu můžeme přerušit příkazem &amp;#039;&amp;#039;LEAVE&amp;#039;&amp;#039;. Příkazem &amp;#039;&amp;#039;ITERATE&amp;#039;&amp;#039; zahájíme novou iteraci cyklu.&lt;br /&gt;
Tyto dva příkazy mají povinné návěstí, tudíž cykly na které se váží, musí mít přiřazeno návěstí také. Tím je naprosto &lt;br /&gt;
jednoznačně určeno, který cyklus skončí nebo kde se zahájí další iterace.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Syntaxe&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEAVE navesti&lt;br /&gt;
ITERATE navesti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;WikiSysop</name></author>
	</entry>
</feed>