<?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%ADru%C4%8Dka_SQL%2FPSM</id>
	<title>Příručka SQL/PSM - 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%ADru%C4%8Dka_SQL%2FPSM"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=P%C5%99%C3%ADru%C4%8Dka_SQL/PSM&amp;action=history"/>
	<updated>2026-06-02T21:08:08Z</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%ADru%C4%8Dka_SQL/PSM&amp;diff=221&amp;oldid=prev</id>
		<title>194.255.108.253: /* Úvod do SQL/PSM (PL/pgPSM) */</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=P%C5%99%C3%ADru%C4%8Dka_SQL/PSM&amp;diff=221&amp;oldid=prev"/>
		<updated>2007-12-09T09:47:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Úvod do SQL/PSM (PL/pgPSM)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Úvod do SQL/PSM (PL/pgPSM)==&lt;br /&gt;
Začátkem devadesátých let minulého století začalo být jasné, že standard ANSI SQL postrádá prostředky pro tvorbu uložených procedur (zejména možnost deklarovat proměnné a dále s nimi pracovat, řízení toku - cykly a podmínky). Na tuto skutečnost reagovaly komerční firmy implementací vlastních proprietárních prostředí. Zřejmě nejpopulárnějšími v té době byly jazyky PL/SQL (Oracle, 1992), T-SQL (Sybase a Microsoft, 1995) a SPL (Informix, 1996). Od roku 1990 se v standardizační komisi ANSI SQl této problematice začala věnovat skupina vývojářů kolem Jima Meltona. Nejstarší zmínka o SQL/PSM je ze srpna roku 1994. (Prvním výstupem bylo PSM-96 (PSM - Persistent Stored Modules) postavené nad SQL92. Ve svém článku [http://www.dbmsmag.com/9701d06.html Budoucnost programování v SQL] z ledna 1997 zmiňuje Joe Celko SQL/PSM jako jazyk vycházející z Algolu rozšířený o prvky Ady (řešení výjimek). V roce 1998 (draft) standard byl již součástí SQL3 a označen současným názvem SQL/PSM (ANSI/ISO/IEC 9075-4:1999). Bohužel v té době většina významných firem již měla své vlastní prostředí (nekompatibilní se standardem), které, jak se ukázalo později, neopustily. Standard byl implementován pouze v těch RDBMS, kde do roku 1998 nebyla možnost tvorby SQL uložených procedur. Kromě DB2 (SQL PL, IBM, 2001) se většinou jedná o minoritní RDNMS: Mimer, Solid, 602SQL server. Do popředí se SQL/PSM opět dostává po roce 2005, kdy je implementován v Advantage Database Serveru (Sybase iAnywhere, 2005), v MySQL (2005) a PostgreSQL (2007). Jen zřídka je SQL/PSM implementován v plném rozsahu. Za zdařilou implementaci se pokládá SQL PL v DB2. Implementace SQL/PSM v PostgreSQL se nazývá (jak je v PostgreSQL zvykem) PL/pgPSM. &lt;br /&gt;
&lt;br /&gt;
Stručně lze programovací jazyk definovaný v SQL/PSM charakterizovat jako jednoúčelový, zcela nový, moderní, jednoduchý procedurální programovací jazyk s integrovaným SQL a úzkou vazbou na prostředí SQL serverů. Jedná se o jazyk s bohatým repertoárem řídících konstrukcí a komfortním modelem zachycení a zpracování chyb. Datové typy, funkce přebírá z hostitelského SQL serveru. I/O rutiny pak úplně chybí (přesně v duchu architektury uložených procedur). Standard SQL/PSM se nevěnuje pouze popisu SQL procedur. Obsahuje i popis uspořádání procedur do modulů a popis tzv. externích procedur (implementace procedur v dalších prg. jazycích, např. C, Cobol, atd). Přestože se jedná o zcela nový programovací jazyk, na celé řadě konstrukcí je zřejmá inspirace jazyky PL/1, jazyky ADA, Modula a dalšími jazyky. &lt;br /&gt;
&lt;br /&gt;
Následující ukázka je modifikací klasického příkladu Hello world v prostředí SQL/PSM. Parametrem funkce je jedinečný identifikátor uživatele. Uvnitř funkce se na základě tohoto identifikátoru získá skutečné jméno a příjmení uživatele z tabulky Users. Všimněte si deklarace proměnné, plnění proměnné hodnotou z tabulky (integrace SQL příkazu SELECT), použití SQL datového typu (varchar) a SQL oparátoru (operátor ||), komentáře.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION hello(uid integer)&lt;br /&gt;
RETURNS varchar AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE real_name varchar;&lt;br /&gt;
    -- Get real name&lt;br /&gt;
    SET real_name = (SELECT name || &amp;#039; &amp;#039; || surname &lt;br /&gt;
                        FROM Users &lt;br /&gt;
                       WHERE Users.uid = hello.uid);&lt;br /&gt;
    RETURN &amp;#039;Hello, &amp;#039; || real_name;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
SELECT hello(123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vložení zdrojového kódu funkce mezi dvojici symbolů $$ je specifické pro PostgreSQL. PL/pgPSM je z pohledu PostgreSQL externí programovací jazyk, jako ostatní podporované PL jazyky (PL/pgSQL, PL/Perl, PL/Python), a tudíž PostgreSQL k tomuto jazyku přistupuje stejně a vynucuje si stejná pravidla zápisu. Implementace SQL/PSM má ještě další dvě podstatné odlišnosti od standardu. Za prvé, PostgreSQL umožňuje definovat pouze funkce (nikoliv procedury), což se projevuje určitými omezeními v řízení transakcí. Za druhé, PostgreSQL implicitně spouští funkce v režimu SECURITY CALLER, kdežto standard předpokládá režim SECURITY DEFINER. Mezi standardem a implementací SQL/PSM v PostgreSQL je ještě několik dalších rozdílů daných určitou volností standardu a implementačními závislostmi, nicméně nejedná se o nijak zvlášť markantní rozdíly. Asi je ještě předčasné počítat s plnou přenositelností kódu mezi RDBMS podporujícími SQL/PSM, nicméně v celé řadě případů sou jsou nutné úpravy minimální. Problémy mohou nastat u normou neošetřených konstrukcí (unbound selects, multirecordsets, atd).&lt;br /&gt;
&lt;br /&gt;
Jazyk SQL/PSM je v RDBMS PostgreSQL (PL/pgPSM) běží na modifikovaném run-time PL/pgSQL. Tudíž výkonnostně i funkčně je na tom velice podobně jako jazyk PL/pgSQL. PL/pgSQL je v tuto chvíli vyzrálejší a časem prověřené prostředí vhodné pro jakkoliv kritické aplikace. PL/pgPSM naopak přináší shodu se standardem a novější, a bohatší programovací jazyk.&lt;br /&gt;
&lt;br /&gt;
Rozlišujeme mezi tzv. externími uloženými procedurami a SQL uloženými procedurami. Rozdíl je v použitém jazyce a v přístupu. Pokud uložené procedury jsou realizovány v klasických prg. jazycích, a běží mimo prostředí SQL serveru (vlastní funkce, vlastní datové typy), jedná se o externí procedury. V případě, že se použije specializovaný jazyk a procedura běží v prostředí SQL serveru (sdílí datové typy a funkce), pak takovou proceduru označujeme jako SQL proceduru. Příklady SQL procedur jsou prostředí PL/SQL, T-SQL, nebo PSQL či PL/pgSQL, PL/pgPSM. Externí procedury jsou standardizované pouze pro jazyk Java (SQL/J). Existuje ovšem celá řada dalších implementací např. CLR pro SQLServer 2005 nebo PL/Perl, PL/Python pro PostgreSQL. Obě třídy procedur mají své pro a proti, doporučuje se ale upřednostnění SQL procedur vyjma těch případů, kdy jsou neefektivní (např. iterační výpočet integrálu) nebo chybí dostatečná funkcionalita (např. I/O operace). Velkou výhodou SQL procedur je integrace s prostředím. Zpravidla nedochází k zbytečným konverzím, a obvykle se používají předzpracované SQL příkazy (prepared statements). Kromě toho všechny statické SQL příkazy jsou verifikované (což ještě neznamená, že jsou 100% správné, nicméně to znamená, že jsou syntakticky správné).&lt;br /&gt;
&lt;br /&gt;
== Praktické tipy návrhu uložených procedur v prostředí PL/pgPSM ==&lt;br /&gt;
V podstatě platí veškerá doporučení pro návrh jakéhokoliv software, tj. požadavky na čitelnost, srozumitelnost kódu:&lt;br /&gt;
* dbejte na dodržování jmenné konvence,&lt;br /&gt;
* používejte komentáře a názorné názvy proměnných,&lt;br /&gt;
* používejte jednotnou konvenci pro odsazování bloků,&lt;br /&gt;
* dodržujte rozumnou délku procedury (kolem 50 řádků),&lt;br /&gt;
* používejte &amp;quot;upovídaný&amp;quot; styl .. využívejte volitelná návěstí smyček.&lt;br /&gt;
&lt;br /&gt;
K tomu ještě specifická doporučení platná pouze pro SQL uložené procedury (bez ohledu na konkrétní prostředí):&lt;br /&gt;
* pomocí prefixů a kvalifikovaných jmen atributů se vyhněte možným kolizím názvů sloupců a jmen proměnných,&lt;br /&gt;
* jednotným způsobem řešte zachycení a ošetření chyb,&lt;br /&gt;
* vyhněte se ISAM programování - co lze vyřešit pomocí SQL řešte pomocí SQL (pozor na cykly napříč celými tabulkami),&lt;br /&gt;
* omezte kurzory a dočasné tabulky na nezbytné minimum,&lt;br /&gt;
* v triggerech neopravujte data,&lt;br /&gt;
* procedury by měli realizovat určitou činnost, nikoliv jen zapouzdřit selecty.&lt;br /&gt;
&lt;br /&gt;
Na následujících dvou příkladech si všimněte špatného (ISAM) přístupu a dobrého přístupu k návrhu uložených procedur. Obě procedury volají pro určitou podmnožinu zaměstnanců proceduru print_info. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- spatne (ISAM pristup)&lt;br /&gt;
CREATE OR REPLACE FUNCTION report_a()&lt;br /&gt;
RETURNS void AS &lt;br /&gt;
$$&lt;br /&gt;
  main: FOR outer AS &lt;br /&gt;
            SELECT id FROM Users &lt;br /&gt;
        DO&lt;br /&gt;
          BEGIN&lt;br /&gt;
            DECLARE name, surname varchar;&lt;br /&gt;
            DECLARE age int;&lt;br /&gt;
            SET (name, surname, age) = (SELECT e.name, e.surname, e.age&lt;br /&gt;
                                           FROM Employers e&lt;br /&gt;
                                          WHERE e.id = outer.id);&lt;br /&gt;
            IF age &amp;gt;= 20 AND age &amp;lt;= 29 THEN&lt;br /&gt;
              CALL print_info(name, surname, age, &amp;#039;y&amp;#039;);&lt;br /&gt;
            ELSE IF age &amp;gt;=30 AND age &amp;lt;= 50 THEN&lt;br /&gt;
              CALL print_info(name, surname, age, &amp;#039;o&amp;#039;);&lt;br /&gt;
            END IF;                     &lt;br /&gt;
          END;&lt;br /&gt;
        END FOR main;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
-- dobre&lt;br /&gt;
CREATE OR REPLACE FUNCTION report_b()&lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  main: FOR fc AS&lt;br /&gt;
            -- veskere mozne podminky a transformace resim v prikazu SELECT&lt;br /&gt;
            SELECT e.*, CASE WHEN e.age BETWEEN 20 AND 29 THEN &amp;#039;y&amp;#039;&lt;br /&gt;
                             WHEN e.age BETWEEN 30 AND 50 THEN &amp;#039;o&amp;#039; END AS tp&lt;br /&gt;
               FROM Employers e&lt;br /&gt;
              WHERE e.age BETWEEN 20 AND 50&lt;br /&gt;
        DO&lt;br /&gt;
          CALL print_info(fc.name, fc.surname, fc.age, fc.tp);&lt;br /&gt;
        END FOR main;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Příručka jazyka PL/pgPSM ==&lt;br /&gt;
Každá funkce obsahuje jeden PL/pgPSM příkaz. Následující jedno příkazové funkce jsou korektní. Pozn. Pro uživatele PL/SQL jazyků to může být mírný šok. Na rozíl od PL/SQL, kde základním příkazem funkce nebo procedury je složený příkaz, je v SQL/PSM základním příkazem libovolný příkaz. Pokud funkce neobsahuje žádný SQL příkaz, používejte atribut IMMUTABLE. Kromě jiného i zajistíte efektivnější provádění funkce. Speciálním PL/pgPSM příkazem je [[Složený příkaz|složený příkaz]], který umožňuje zadat libovolně dlouhou syntakticky správnou posloupnost PL/pgPSM příkazů.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION sum2params(IN a integer, IN b integer, OUT c integer) AS &lt;br /&gt;
$$&lt;br /&gt;
  SET c = a + b;&lt;br /&gt;
$$ LANGUAGE plpgpsm IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION insert_val(a integer)&lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  INSERT INTO Foo VALUES(a);&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION get_sum(IN a integer, OUT b integer) AS&lt;br /&gt;
$$&lt;br /&gt;
  SET b = (SELECT sum(f.a) &lt;br /&gt;
              FROM Foo f&lt;br /&gt;
             WHERE f.a &amp;gt; get_sum.a);&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION dummy() &lt;br /&gt;
RETURNS void AS&lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm IMMUTABLE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
K dispozici jsou následující příkazy:&lt;br /&gt;
* [[SQL příkaz#SQL příkaz|SQL příkaz]],&lt;br /&gt;
* [[Složený příkaz|složený příkaz]] -  mezi dvojicí BEGIN a END je libovolný počet PL/pgPSM příkazů oddělených středníkem,&lt;br /&gt;
* [[Příkazy CALL a RETURN|Volání a ukončení procedury]] - příkazy CALL a RETURN,&lt;br /&gt;
* [[Přiřazovací příkaz|přiřazovací příkaz]] - SET proměnná = hodnota,&lt;br /&gt;
* [[Podmíněné provádění příkazů]]:&lt;br /&gt;
** [[Podmíněné provádění příkazů#Příkaz IF|IF ELSEIF ELSE END IF]],&lt;br /&gt;
** [[Podmíněné provádění příkazů#Příkaz CASE|CASE WHEN THEN END CASE]].&lt;br /&gt;
* [[Příkazy cyklu|Příkazy cyklu]]&lt;br /&gt;
** [[Příkazy cyklu#Příkaz LOOP|LOOP co END LOOP]],&lt;br /&gt;
** [[Příkazy cyklu#Příkaz WHILE|WHILE podmínka DO co END WHILE]],&lt;br /&gt;
** [[Příkazy cyklu#Příkaz REPEAT|REPEAT co UNTIL podmínka END REPEAT]],&lt;br /&gt;
** [[Příkazy cyklu#Příkaz FOR|FOR select DO co END FOR]] (iterace napříč výsledkem dotazu).&lt;br /&gt;
* [[signalizace chyb]] - SIGNAL a RESIGNAL&lt;br /&gt;
* [[Příkaz PRINT|zobrazení výsledku na konzoli]] - PRINT (nestandardní konstrukce),&lt;br /&gt;
* [[Příkazy cyklu#Příkazy LEAVE a ITERATE|opuštění a nová iterace cyklu]] - příkazy LEAVE a ITERATE,&lt;br /&gt;
* [[Dynamické SQL|dynamické SQL]] - EXECUTE a EXECUTE IMMEDIATE,&lt;br /&gt;
* [[Příkaz GET DIAGNOSTICS]] - získání diagnostických údajů.&lt;br /&gt;
&lt;br /&gt;
Ještě před samotným popisem PL/pgPSM příkazů si projděte následující jednoduché ukázky:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- case statement&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo1(a integer)&lt;br /&gt;
RETURNS void AS $$&lt;br /&gt;
  CASE a&lt;br /&gt;
    WHEN 1, 3, 5, 7, 9 THEN&lt;br /&gt;
      PRINT a, &amp;#039;is odd number&amp;#039;;&lt;br /&gt;
    WHEN 2, 4, 6, 8, 10 THEN&lt;br /&gt;
      PRINT a. &amp;#039;is odd number&amp;#039;;&lt;br /&gt;
    ELSE &lt;br /&gt;
      PRINT a, &amp;#039;isn&amp;#039;t from range 1..10&amp;#039;;&lt;br /&gt;
  END CASE;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
-- while statement&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo2(a integer)&lt;br /&gt;
RETURNS void AS &lt;br /&gt;
$$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DECLARE i integer DEFAULT 1;&lt;br /&gt;
    WHILE i &amp;lt;= a &lt;br /&gt;
    DO&lt;br /&gt;
      PRINT i;&lt;br /&gt;
      SET i = i + 1;&lt;br /&gt;
    END WHILE;&lt;br /&gt;
  END&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&lt;br /&gt;
-- for statement&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo3(a integer)&lt;br /&gt;
RETURNS void AS &lt;br /&gt;
$$&lt;br /&gt;
  FOR fc AS&lt;br /&gt;
      SELECT i &lt;br /&gt;
         FROM generate_series(1,a) AS g(i)&lt;br /&gt;
  DO&lt;br /&gt;
    PRINT fc.i;&lt;br /&gt;
  END FOR;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Použití jazyka PL/pgPSM ===&lt;br /&gt;
* [[SQL příkaz#Použití kurzorů|Použití kurzorů]]&lt;br /&gt;
* [[SQL příkaz#Funkce vracející tabulky|Funkce vracející tabulky]]&lt;br /&gt;
* [[Složený příkaz#Ošetření chyb|Ošetření chyb, signalizace chyby (výjimky) a zachycení signálu]]&lt;br /&gt;
* [[Použití dočasných tabulek v PL/pgPSM]]&lt;br /&gt;
&lt;br /&gt;
== Parametry ovlivňující provádění funkcí ==&lt;br /&gt;
V PL/pgPSM jsou k dispozici dva přepínače: DUMP a RECOMPILE. Použití prvního způsobí výpis přeloženého kódu funkce do systémového logu. Druhý zajistí vynulování nakešovaných prováděcích plánů při každém startu funkce. Parametry se zapisují ještě před vlastní kód za klíčové slovo #OPTION.&lt;br /&gt;
&lt;br /&gt;
=== #OPTION DUMP ===&lt;br /&gt;
Účelem tohoto přepínače je zobrazení přeloženého kódu do systémováho logu. Rozhodně se nejedná o typickou činnost - většina uživatelů PL/pgSQL o této možnosti v životě neslyšela. Dokáže být velice užitečný při hledání kolize názvů proměnných a SQL atributů. V případě této chyby nám systém hlásí (v lepším případě), že dotaz nelze přeložit nebo (v horším případě) je výsledek dotazu jiný než očekáváme.&lt;br /&gt;
&lt;br /&gt;
Tento přepínač demonstruje skutečnost, že PL/pgSQL je v podstatě preprocesor jazyka SQL. Vlastní interpret je natolik minimalistický, že pro provádění veškerých operací (logických, aritmetických) se spoléhá na SQL. Díky tomu je zajištěna kompatibilita s SQL. Na druhou stranu PL/pgSQL se nehodí pro výpočetně náročné úlohy (s provedením každého SQL příkazu je spojená nezanedbatelná režie). K těmto účelům v PostgreSQL slouží PL/Perl, PL/Python nebo klasické C.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- tabulka foo obsahuje sloupec a&lt;br /&gt;
CREATE OR REPLACE FUNCTION kolize(a integer)&lt;br /&gt;
RETURNS SETOF Foo AS&lt;br /&gt;
$$&lt;br /&gt;
#option dump&lt;br /&gt;
  SELECT * &lt;br /&gt;
    FROM Foo &lt;br /&gt;
   WHERE a = a;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jedná se o skutečně záludnout chybu (a poměrně častou). Přeložený kód výpadá následovně:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Execution tree of successfully compiled PL/pgSQL function kolize(integer):                            &lt;br /&gt;
                                                                                                      &lt;br /&gt;
Function&amp;#039;s data area:                                                                                 &lt;br /&gt;
    entry 0: VAR $1               type int4 (typoid 23) atttypmod -1                                  &lt;br /&gt;
    entry 1: VAR found            type bool (typoid 16) atttypmod -1                                  &lt;br /&gt;
                                                                                                      &lt;br /&gt;
Function&amp;#039;s statements:                                                                                &lt;br /&gt;
  0: *unnamed*:                                                                                       &lt;br /&gt;
     BLOCK                                                                                            &lt;br /&gt;
  2:   SQL &amp;#039;SELECT * FROM Foo WHERE  $1  =  $1  {$1=0}&amp;#039;                                               &lt;br /&gt;
  0:   RETURN NULL                                                                                    &lt;br /&gt;
     END *unnamed*                                                                                    &lt;br /&gt;
                                                                                                      &lt;br /&gt;
End of execution tree of function kolize(integer)   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Chyba je v podmínce WHERE. PL/pgSQL nechápe zápis a = a jako podmínku typu: SQL atribut je roven proměnné. Zápis znamená, že proměnná a je rovna proměnné a, což je splněno pro všechny řádky tabulky, a také výsledkem je celá tabulka Foo.&lt;br /&gt;
&lt;br /&gt;
=== #OPTION RECOMPILE ===&lt;br /&gt;
Tento přepínač snižuje pravděpodobnost nekonzistence prováděcích plánů tím, že před každým startem procesury se procedura znovu přeloží a tím dojde k vyčištění cache prováděcích plánů. Zároveň se tím ale prodlouží doba spuštění procedury (dochází k překladu) a doba běhu (dochází k průbežnému vytváření prováděcích plánů). Tudíž tento přepínač používejte jen v nutných případech, nebo ještě lépe, nepoužívejte jej vůbec. Jak se vyhnout použití přepínače RECOMPILE je popsáno v sekci věnované [[Použití dočasných tabulek v PL/pgPSM|dočasným tabulkám]].Účelem tohoto přepínače je usnadnit portování uložených procedur z jiných RDBMS, kde jinak funguje ukládání prováděcích plánů. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION testr()&lt;br /&gt;
RETURNS SETOF Foo AS&lt;br /&gt;
$$&lt;br /&gt;
#option dump recompile&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DROP TABLE IF EXISTS FooG;&lt;br /&gt;
    INSERT INTO FooG&lt;br /&gt;
       SELECT * &lt;br /&gt;
          FROM Foo;&lt;br /&gt;
    RETURN TABLE(SELECT *&lt;br /&gt;
                    FROM FooG);&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgpsm;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento přepínač je analogií přepínači WITH RECOMPILE v T-SQL Microsoft SQL Serveru.&lt;br /&gt;
&lt;br /&gt;
== Portování uložených procedur z MySQL 5.x ==&lt;br /&gt;
Originální [[zdrojový kód procedury generující fraktály]] je přebrán z archivu MySQL dev. PostgreSQL řeší jinak:&lt;br /&gt;
* změnu aktuálního schématu,&lt;br /&gt;
* zápis zdrojového kódu procedury (nepoužívá mechanismus separátoru),&lt;br /&gt;
* pro spojení řetězců používá operátor || nikoliv funkci concat,&lt;br /&gt;
* neumožňuje volné SQL dotazy, jelikož nepodporuje procedury, ale pouze funkce.&lt;br /&gt;
&lt;br /&gt;
Všimněte si minimálních rozdílů v [[zdrojový kód procedury generující fraktál pro PostgreSQL|upraveném kódu pro PostgreSQL]].&lt;br /&gt;
&lt;br /&gt;
== Instalace PL/pgPSM ==&lt;br /&gt;
Vzhledem k nezralosti implementace PL/pgPSM ještě tento interpret není zařazen do distribuce. Zatím je ke stažení v jeslích postgresql projektů http://pgfoundry. Přesun do distribuce bude možný až po plné implementaci standardu a po důkladném otestování. Zatím zbývá dopsat podporu příkazů RESIGNAL a GET STACKET DIAGNOSTIC. Pokud se obejdete bez těchto příkazů, můžete používat PL/pgPSM bez obav. Interpret PL/pgPSM je modifikací interpretu PL/pgSQL, který je lety i tisíci projekty důkladně prověřen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Pro překlad PL/pgPSM je potřeba instalovat PostgreSQL ze zdrojových kódů.&amp;#039;&amp;#039; Potřebujete alespoň verzi 8.2. Poslední verzi PL/pgPSM naleznete na http://pgfoundry.org/frs/?group_id=1000238&amp;amp;release_id=767.&lt;br /&gt;
=== Postup ===&lt;br /&gt;
* Stáhněte si nejnovější zdrojové soubory PL/pgPSM z adresáře http://pgfoundry.org/frs/?group_id=1000238&lt;br /&gt;
* pokud máte PostgreSQL instalovaný ze zdrojových kódů, rozbalte archív do adresáře contrib&lt;br /&gt;
* proveďte příkazy make a make install&lt;br /&gt;
* jako superuser spusťe psql postgres &amp;lt; plpgpsm.sql&lt;br /&gt;
* od tohoto okamžiku můžete používat plpgpsm stejně jako ostatní jazyky&lt;br /&gt;
* test instalace make installcheck&lt;br /&gt;
&lt;br /&gt;
Pokud nemáte PostgreSQL instalovaný ze zdrojových kódů, musíte mít alespoň develop knihovny PostgreSQL&lt;br /&gt;
* kdekoliv rozbalte archiv plpgpsm&lt;br /&gt;
* spusťte příkazy make USE_PGXS=1 a make USE_PGXS=1 install&lt;br /&gt;
* další postup je stejný jako v předchozím případě&lt;br /&gt;
&lt;br /&gt;
Uvítáme jakoukoliv formu spolupráce. A to ať doplněním této dokumentace, její korekturou, překladem, rozšířením testovacích scénářů, doplněním funkcionality nebo samotným použitím.&lt;/div&gt;</summary>
		<author><name>194.255.108.253</name></author>
	</entry>
</feed>