English translation
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 pst. Zdrojové kódy modulu lze stáhnout z adresy http://pgfoundry.org/frs/?group_id=1000457.
Funkce pro práci s řetězci
sprintf(formatstr [, hodnoty]) |
viz man sprintf
|
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).
|
concat(hodnoty) |
Spojí parametry do jednoho řetězce
|
concat_ws(separator, hodnoty) |
Spojí hodnoty do jednoho řetězce, oddělovačem je první parametr
|
concat_sql(hodnoty) |
Vytvoří seznam (čárkou oddělené hodnoty) ve formátu SQL
|
concat_js(hodnoty) |
Vytvoří seznam (čárkou oddělené hodnoty) ve formátu JSON
|
left(řetězec, početznaků) |
Vrací prvních n znaků zleva, pokud je n záporné, tak znaky zleva bez posledních n znaků
|
right(řetězec, početznaků) |
Vrací prvních n znaků zprava, pokud je n záporné, tak znaky zprava bez prvních n znaků
|
reverse(řetězec) |
Zrcadlově prohodí znaky v řetězci
|
chars_to_array(řetězec) |
Rozloží řetězec na pole znaků
|
diff_string(řetězeca, řetězecb) |
Vrací rozdíl dvou řetězců
|
pavel=# select pst.sprintf('>>%010.4f<<', 3.14);
sprintf
----------------
>>00003.1400<<
(1 row)
pavel=# select pst.format('INSERT INTO %I VALUES(%L,%L)', 'my tab', NULL, 'Hello');
format
-------------------------------------------
INSERT INTO "my tab" VALUES(NULL,'Hello')
(1 row)
pavel=# select pst.concat_js(10, 'Hello', true, current_date);
concat_js
------------------------------
10,"Hello",true,"2010-12-30"
(1 row)
pavel=# select pst.chars_to_array('Hello');
chars_to_array
----------------
{H,e,l,l,o}
(1 row)
pavel=# select pst.diff_string('Hello World','Hello');
diff_string
---------------------
Hello<del> World</>
(1 row)
-- formatovaci operator %%
pavel=# select 'Hello %s, %10s, %s' %% ('World',1999,current_date);
?column?
-------------------------------------
Hello World, 1999, 2011-01-08
(1 row)
Kalendářní funkce
next_day(datum, názevdne) |
Vrací první určený den v týdnu po zadaném dnu
|
last_day(datum) |
Vrací poslední den v měsíci daného dnem
|
pavel=# select next_day(to_date('2010-12-31','YYYY-MM-DD'), 'mon');
next_day
------------
2011-01-03
(1 row)
pavel=# select last_day(to_date('2010-12-31','YYYY-MM-DD'));
last_day
------------
2010-12-31
(1 row)
Funkce pro operace s typem record
record_expand(rec) |
Převede hodnotu složeného typu na tabulku
|
record_get_field(rec, názevpol) |
Vrací hodnotu vybrané položky
|
record_get_fields(rec, názevpol1, ..) |
Vrací pole hodnot vybraných položek
|
record_set_fields(rec, názevpol, hodnota, ..) |
Vrací modifikovaný record, úpravy jsou zadány vždy jako dvojice: název, hodnota
|
create or replace function omega_trg_fce()
returns trigger as $$
declare r record;
begin
for r in select * from record_expand(new)
loop
raise notice 'name := "%", value := "%"', r.name, r.value;
end loop;
return new;
end;
$$ language plpgsql;
create trigger xxx before insert on omega for each row execute procedure omega_trg_fce();
pavel=# select * from pst.record_expand(row(10,20));
name | value | typ
------+-------+---------
f1 | 10 | integer
f2 | 20 | integer
(2 rows)
pavel=# select * from pst.record_expand(pst.record_set_fields(row(10,20),'f1',33));
name | value | typ
------+-------+---------
f1 | 33 | integer
f2 | 20 | integer
(2 rows)
Funkce pro operace s typem bitmapset
add_member(množina, číslo) |
Přidá číslo do množiny
|
add_members(množina, číslo, ..) |
Umožňuje přidat více čísel do množiny
|
del_member(množina, číslo) |
Odstraní číslo z množiny
|
del_members(množina, číslo, ..) |
Odstraní čísla z množiny
|
is_member(množina, číslo) |
Ověří, zda-li je číslo členem množiny
|
bitmapset_union(množina, množina) |
Vrací sloučení dvou množin
|
bitmapset_intersect(množina, množina) |
Vrací průnik dvou množin
|
bitmapset_difference(množina, množina) |
Vrací množinu prvků první množiny bez prvků v druhé množině
|
bitmapset_overlap(množina, množina) |
Vrací true pokud mají množiny neprázdný průnik
|
bitmapset_is_empty(množina) |
Vrací true, pokud je množina neprázdná
|
bitmapset_num_members(množina) |
Vrací počet prvků množiny
|
pavel=# select pst.bitmapset '{1,2,7}';
bitmapset
-----------
{1,2,7}
(1 row)
pavel=# select pst.add_member(pst.bitmapset '{1,2,7}',44);
add_member
------------
{1,2,7,44}
(1 row)
pavel=# select pst.is_member('{}', 22);
is_member
-----------
f
(1 row)
pavel=# select pst.bitmapset_union('{1,2,3}','{3,4,5}');
bitmapset_union
-----------------
{1,2,3,4,5}
(1 row)
Pomocné funkce
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í.
|
pavel=# insert into omega2 select (x.xx).*
from (select pst.counter(omega,200000, true) xx
from omega
) x;
NOTICE: processed 200000 rows, current value is '(5,8)'
NOTICE: processed 200000 rows, current value is '(5,8)'
NOTICE: processed 400000 rows, current value is '(6,8)'
NOTICE: processed 400000 rows, current value is '(6,8)'
NOTICE: processed 600000 rows, current value is '(7,8)'
NOTICE: processed 600000 rows, current value is '(7,8)'
NOTICE: processed 800000 rows, current value is '(1,8)'
NOTICE: processed 800000 rows, current value is '(1,8)'
NOTICE: processed 1000000 rows, current value is '(5,8)'
NOTICE: processed 1000000 rows, current value is '(5,8)'
INSERT 0 1000000