<?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=PL_toolbox</id>
	<title>PL toolbox - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=PL_toolbox"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PL_toolbox&amp;action=history"/>
	<updated>2026-05-13T00:33:34Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=PL_toolbox&amp;diff=492&amp;oldid=prev</id>
		<title>imported&gt;Pavel v 19. 2. 2011, 18:54</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PL_toolbox&amp;diff=492&amp;oldid=prev"/>
		<updated>2011-02-19T18:54:40Z</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;[[PL toolbox (en)|English translation]]&lt;br /&gt;
&lt;br /&gt;
PLpgSQL toolbox je modul s funkcemi, které jsou navrženy jako pomocné funkce při vývoji v PLpgSQL. Některé z funkcí z tohoto modulu jsou jako vestavěné funkce v PostgreSQL 9.1 (některé funkce pro práci s řetězci). Většina ostatních v PostgreSQL není a zatím se nepočítá s jejich zařazením. Všechny funkce jsou umístěny do schématu &amp;#039;&amp;#039;pst&amp;#039;&amp;#039;. Zdrojové kódy modulu lze stáhnout z adresy http://pgfoundry.org/frs/?group_id=1000457.&lt;br /&gt;
===Funkce pro práci s řetězci===&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
| sprintf(formatstr [, hodnoty]) ||  viz man sprintf&lt;br /&gt;
|-&lt;br /&gt;
| format(formatstr [, hodnoty]) || Nahradí substituční symboly hodnotou odpovídajícího parameteru. Podporovány jsou symboly - %s řetězec, %I SQL identifikátor, %L SQL literal (řetězec). &lt;br /&gt;
|-&lt;br /&gt;
| concat(hodnoty) || Spojí parametry do jednoho řetězce&lt;br /&gt;
|-&lt;br /&gt;
| concat_ws(separator, hodnoty) || Spojí hodnoty do jednoho řetězce, oddělovačem je první parametr&lt;br /&gt;
|-&lt;br /&gt;
| concat_sql(hodnoty) || Vytvoří seznam (čárkou oddělené hodnoty) ve formátu SQL&lt;br /&gt;
|-&lt;br /&gt;
| concat_js(hodnoty) || Vytvoří seznam (čárkou oddělené hodnoty) ve formátu JSON&lt;br /&gt;
|-&lt;br /&gt;
| left(řetězec, početznaků) || Vrací prvních n znaků zleva, pokud je n záporné, tak znaky zleva bez posledních n znaků&lt;br /&gt;
|-&lt;br /&gt;
| right(řetězec, početznaků) || Vrací prvních n znaků zprava, pokud je n záporné, tak znaky zprava bez prvních n znaků&lt;br /&gt;
|-&lt;br /&gt;
| reverse(řetězec) || Zrcadlově prohodí znaky v řetězci&lt;br /&gt;
|-&lt;br /&gt;
| chars_to_array(řetězec) || Rozloží řetězec na pole znaků&lt;br /&gt;
|-&lt;br /&gt;
| diff_string(řetězeca, řetězecb) || Vrací rozdíl dvou řetězců&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pavel=# select pst.sprintf(&amp;#039;&amp;gt;&amp;gt;%010.4f&amp;lt;&amp;lt;&amp;#039;, 3.14);&lt;br /&gt;
    sprintf     &lt;br /&gt;
----------------&lt;br /&gt;
 &amp;gt;&amp;gt;00003.1400&amp;lt;&amp;lt;&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.format(&amp;#039;INSERT INTO %I VALUES(%L,%L)&amp;#039;, &amp;#039;my tab&amp;#039;, NULL, &amp;#039;Hello&amp;#039;);&lt;br /&gt;
                  format                   &lt;br /&gt;
-------------------------------------------&lt;br /&gt;
 INSERT INTO &amp;quot;my tab&amp;quot; VALUES(NULL,&amp;#039;Hello&amp;#039;)&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.concat_js(10, &amp;#039;Hello&amp;#039;, true, current_date);&lt;br /&gt;
          concat_js           &lt;br /&gt;
------------------------------&lt;br /&gt;
 10,&amp;quot;Hello&amp;quot;,true,&amp;quot;2010-12-30&amp;quot;&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.chars_to_array(&amp;#039;Hello&amp;#039;);&lt;br /&gt;
 chars_to_array &lt;br /&gt;
----------------&lt;br /&gt;
 {H,e,l,l,o}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.diff_string(&amp;#039;Hello World&amp;#039;,&amp;#039;Hello&amp;#039;);&lt;br /&gt;
     diff_string     &lt;br /&gt;
---------------------&lt;br /&gt;
 Hello&amp;lt;del&amp;gt; World&amp;lt;/&amp;gt;&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- formatovaci operator %%&lt;br /&gt;
pavel=# select &amp;#039;Hello %s, %10s, %s&amp;#039; %% (&amp;#039;World&amp;#039;,1999,current_date);&lt;br /&gt;
              ?column?               &lt;br /&gt;
-------------------------------------&lt;br /&gt;
 Hello World,       1999, 2011-01-08&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kalendářní funkce===&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
| next_day(datum, názevdne) ||  Vrací první určený den v týdnu po zadaném dnu&lt;br /&gt;
|-&lt;br /&gt;
| last_day(datum) || Vrací poslední den v měsíci daného dnem &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pavel=# select next_day(to_date(&amp;#039;2010-12-31&amp;#039;,&amp;#039;YYYY-MM-DD&amp;#039;), &amp;#039;mon&amp;#039;);&lt;br /&gt;
  next_day  &lt;br /&gt;
------------&lt;br /&gt;
 2011-01-03&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select last_day(to_date(&amp;#039;2010-12-31&amp;#039;,&amp;#039;YYYY-MM-DD&amp;#039;));&lt;br /&gt;
  last_day  &lt;br /&gt;
------------&lt;br /&gt;
 2010-12-31&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Funkce pro operace s typem record===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
| record_expand(rec) ||  Převede hodnotu složeného typu na tabulku&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| record_get_field(rec, názevpol)|| Vrací hodnotu vybrané položky &lt;br /&gt;
|-&lt;br /&gt;
| record_get_fields(rec, názevpol1, ..) || Vrací pole hodnot vybraných položek&lt;br /&gt;
|-&lt;br /&gt;
| record_set_fields(rec, názevpol, hodnota, ..) || Vrací modifikovaný record, úpravy jsou zadány vždy jako dvojice: název, hodnota&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create or replace function omega_trg_fce()&lt;br /&gt;
returns trigger as $$&lt;br /&gt;
declare r record;&lt;br /&gt;
begin&lt;br /&gt;
  for r in select * from record_expand(new)&lt;br /&gt;
  loop&lt;br /&gt;
    raise notice &amp;#039;name := &amp;quot;%&amp;quot;, value := &amp;quot;%&amp;quot;&amp;#039;, r.name, r.value;&lt;br /&gt;
  end loop;&lt;br /&gt;
  return new;&lt;br /&gt;
end;&lt;br /&gt;
$$ language plpgsql;&lt;br /&gt;
&lt;br /&gt;
create trigger xxx before insert on omega for each row execute procedure omega_trg_fce();&lt;br /&gt;
&lt;br /&gt;
pavel=# select * from pst.record_expand(row(10,20));&lt;br /&gt;
 name | value |   typ   &lt;br /&gt;
------+-------+---------&lt;br /&gt;
 f1   | 10    | integer&lt;br /&gt;
 f2   | 20    | integer&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
pavel=# select * from pst.record_expand(pst.record_set_fields(row(10,20),&amp;#039;f1&amp;#039;,33));&lt;br /&gt;
 name | value |   typ   &lt;br /&gt;
------+-------+---------&lt;br /&gt;
 f1   | 33    | integer&lt;br /&gt;
 f2   | 20    | integer&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Funkce pro operace s typem bitmapset===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
| add_member(množina, číslo) ||  Přidá číslo do množiny&lt;br /&gt;
|-&lt;br /&gt;
| add_members(množina, číslo, ..) || Umožňuje přidat více čísel do množiny &lt;br /&gt;
|-&lt;br /&gt;
| del_member(množina, číslo) || Odstraní číslo z množiny&lt;br /&gt;
|-&lt;br /&gt;
| del_members(množina, číslo, ..) || Odstraní čísla z množiny&lt;br /&gt;
|-&lt;br /&gt;
| is_member(množina, číslo) || Ověří, zda-li je číslo členem množiny&lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_union(množina, množina) || Vrací sloučení dvou množin&lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_intersect(množina, množina) || Vrací průnik dvou množin&lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_difference(množina, množina) || Vrací množinu prvků první množiny bez prvků v druhé množině&lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_overlap(množina, množina) || Vrací true pokud mají množiny neprázdný průnik &lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_is_empty(množina) || Vrací true, pokud je množina neprázdná&lt;br /&gt;
|-&lt;br /&gt;
| bitmapset_num_members(množina) || Vrací počet prvků množiny&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pavel=# select pst.bitmapset &amp;#039;{1,2,7}&amp;#039;;&lt;br /&gt;
 bitmapset &lt;br /&gt;
-----------&lt;br /&gt;
 {1,2,7}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.add_member(pst.bitmapset &amp;#039;{1,2,7}&amp;#039;,44);&lt;br /&gt;
 add_member &lt;br /&gt;
------------&lt;br /&gt;
 {1,2,7,44}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.is_member(&amp;#039;{}&amp;#039;, 22);&lt;br /&gt;
 is_member &lt;br /&gt;
-----------&lt;br /&gt;
 f&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
pavel=# select pst.bitmapset_union(&amp;#039;{1,2,3}&amp;#039;,&amp;#039;{3,4,5}&amp;#039;);&lt;br /&gt;
 bitmapset_union &lt;br /&gt;
-----------------&lt;br /&gt;
 {1,2,3,4,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pomocné funkce===&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
| counter(rec, početzáznamů, zobrazithodnotu) ||  Při dosažení zadaného počtu záznamů zobrazí informaci o počtu řádků. Tato funkce je filtr. Data, která získá jako parametr pošle na výstup. K tomu ještě počítá počet zpracovávaných záznamů a při dosažení určitého počtu tiskne ladící hlášení.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pavel=# insert into omega2 select (x.xx).* &lt;br /&gt;
           from (select pst.counter(omega,200000, true) xx &lt;br /&gt;
                    from omega&lt;br /&gt;
                ) x;&lt;br /&gt;
NOTICE:  processed 200000 rows, current value is &amp;#039;(5,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 200000 rows, current value is &amp;#039;(5,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 400000 rows, current value is &amp;#039;(6,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 400000 rows, current value is &amp;#039;(6,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 600000 rows, current value is &amp;#039;(7,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 600000 rows, current value is &amp;#039;(7,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 800000 rows, current value is &amp;#039;(1,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 800000 rows, current value is &amp;#039;(1,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 1000000 rows, current value is &amp;#039;(5,8)&amp;#039;&lt;br /&gt;
NOTICE:  processed 1000000 rows, current value is &amp;#039;(5,8)&amp;#039;&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>