<?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=Cursors_in_SQL%2FPSM_samples</id>
	<title>Cursors in SQL/PSM samples - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Cursors_in_SQL%2FPSM_samples"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Cursors_in_SQL/PSM_samples&amp;action=history"/>
	<updated>2026-06-02T20:35:03Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Cursors_in_SQL/PSM_samples&amp;diff=220&amp;oldid=prev</id>
		<title>85.160.67.167: /* cycles */</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Cursors_in_SQL/PSM_samples&amp;diff=220&amp;oldid=prev"/>
		<updated>2007-01-04T05:41:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;cycles&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== cycles ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- basic cycle&lt;br /&gt;
CREATE OR REPLACE FUNCTION fx(a int)&lt;br /&gt;
RETURNS int AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
      DECLARE done bool DEFAULT false;&lt;br /&gt;
      DECLARE aux int;&lt;br /&gt;
&lt;br /&gt;
      DECLARE cx CURSOR FOR&lt;br /&gt;
          SELECT Foo.a FROM Foo;&lt;br /&gt;
&lt;br /&gt;
      DECLARE CONTINUE HANDLER FOR NOT FOUND&lt;br /&gt;
          SET done = true;&lt;br /&gt;
&lt;br /&gt;
      OPEN cx;&lt;br /&gt;
&lt;br /&gt;
      FETCH cx INTO aux;&lt;br /&gt;
   sl:WHILE NOT done DO&lt;br /&gt;
          SET a = a + aux;&lt;br /&gt;
          PRINT fx.a, aux;&lt;br /&gt;
          FETCH cx INTO aux;&lt;br /&gt;
      END WHILE sl;&lt;br /&gt;
&lt;br /&gt;
      CLOSE cx;&lt;br /&gt;
      RETURN a;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
-- cycle controled by SQLSTATE variable&lt;br /&gt;
CREATE OR REPLACE FUNCTION fx(a INT)&lt;br /&gt;
RETURNS int AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE aux int;&lt;br /&gt;
    DECLARE SQLSTATE char(5);&lt;br /&gt;
&lt;br /&gt;
    DECLARE cx CURSOR FOR&lt;br /&gt;
       SELECT * FROM Foo;&lt;br /&gt;
&lt;br /&gt;
    OPEN cx;&lt;br /&gt;
&lt;br /&gt;
    FETCH cx INTO aux;&lt;br /&gt;
    WHILE SQLSTATE = &amp;#039;00000&amp;#039; DO&lt;br /&gt;
      SET a = a + aux;&lt;br /&gt;
      PRINT fx.a, aux;&lt;br /&gt;
      FETCH cx INTO aux;&lt;br /&gt;
    END WHILE;&lt;br /&gt;
&lt;br /&gt;
    CLOSE cx;&lt;br /&gt;
    RETURN a;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
-- crazy sample of for stmt&lt;br /&gt;
CREATE OR REPLACE FUNCTION fx(i integer) &lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR NOT FOUND PRINT &amp;#039;not found&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
 k: FOR aaa AS bbb CURSOR FOR &lt;br /&gt;
        SELECT * &lt;br /&gt;
           FROM generate_series(1, i) as g(idx)&lt;br /&gt;
          WHERE i &amp;gt; 10000&lt;br /&gt;
    DO&lt;br /&gt;
      IF idx &amp;gt; 10 THEN LEAVE k; END IF;&lt;br /&gt;
      PRINT idx;&lt;br /&gt;
    END FOR k;&lt;br /&gt;
&lt;br /&gt;
    PRINT &amp;#039;done&amp;#039;;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrollable cursor support ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION fx() &lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE x, y integer;&lt;br /&gt;
    DECLARE c SCROLL CURSOR FOR &lt;br /&gt;
            SELECT * FROM Foo;&lt;br /&gt;
    OPEN c;&lt;br /&gt;
    FETCH ABSOLUTE -1 FROM c INTO x, y;&lt;br /&gt;
    PRINT x, y;&lt;br /&gt;
    FETCH RELATIVE -1 FROM c INTO x, y;&lt;br /&gt;
    PRINT x, y;&lt;br /&gt;
    FETCH FROM c INTO x, y;&lt;br /&gt;
    PRINT x, y;&lt;br /&gt;
    CLOSE c;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>85.160.67.167</name></author>
	</entry>
</feed>