PL toolbox

Z PostgreSQL
Přejít na: navigace, hledání

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