<?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=Rady_za%C4%8D%C3%A1te%C4%8Dn%C3%ADk%C5%AFm</id>
	<title>Rady začátečníkům - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Rady_za%C4%8D%C3%A1te%C4%8Dn%C3%ADk%C5%AFm"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Rady_za%C4%8D%C3%A1te%C4%8Dn%C3%ADk%C5%AFm&amp;action=history"/>
	<updated>2026-05-12T21:56:31Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Rady_za%C4%8D%C3%A1te%C4%8Dn%C3%ADk%C5%AFm&amp;diff=396&amp;oldid=prev</id>
		<title>imported&gt;Raul: /* Obecná doporučení a povídání */</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Rady_za%C4%8D%C3%A1te%C4%8Dn%C3%ADk%C5%AFm&amp;diff=396&amp;oldid=prev"/>
		<updated>2008-04-26T23:25:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Obecná doporučení a povídání&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Obecná doporučení a povídání ==&lt;br /&gt;
--[[Uživatel:Raul|Raul]] 12:59, 10. 4. 2008 (CEST)&lt;br /&gt;
=== Nespoléhejte na různé administrační nástroje ===&lt;br /&gt;
Když mi před pár týdny Pavel Stěhule povídal o pg (pravda, povídal mi o tom už o dost dříve, ale jak se říká zvyk je železná košile, v mém případě zvyk na mysql), řekl mi mezi řečí pár zajímavých bodů :&lt;br /&gt;
&lt;br /&gt;
# SQL příkazy piš ručně&lt;br /&gt;
# piš je do zvlášť souboru a pak na něj v programu odkazuj&lt;br /&gt;
# nespoléhej na administrační klikátko&lt;br /&gt;
&lt;br /&gt;
Řekl jsem si huh, uff, ghe. Nicméně měl Pavel pravdu a během pár dní jsem zjistil, že velkou pravdu. &lt;br /&gt;
# různé programy mají různé všelijaké rádoby optimalizace a grafický &amp;quot;Query Builder&amp;quot; např. v EMS pg Manageru si SELECT optimalizují už při vytváření po svém. Velice jsem se divil, kdy po přidání tabulky a vazeb do Query Builderu se výsledný SELECT úplně změnil k nepoznání.&lt;br /&gt;
# vytvořil jsem si knihovnu, které tento soubor SQL příkazů převede do pascalu, ve kterém programuji, jejímž výsledkem jsou procedury a funkce. Toto jsem navíc udělal zvlášť pro mySQL i pg, tudíž mojí aplikaci moc nezajímá, kterou db zrovna používám.&lt;br /&gt;
# jak už jsem psal výše, administrační klikátka, mají různé &amp;quot;rádobyfíčurky&amp;quot;, někdy pomohou, někdy uškodí. Napadá mě můj pokus o cizí klíč pro zamezení DELETE (ON DELETE RESTRICT), kdy vše po naklikání fungovalo. Až do doby první změny. Z neznámého důvodu totiž EMS pg Manager neumí vytvořit vazbu na cizí klíč pouze pro DELETE, ale zároveň ji vytvoří i pro UPDATE. Ručně napsaný SQL příkaz pro vytvoření tabulky Vám to však neudělá.&lt;br /&gt;
&lt;br /&gt;
Proto doporučuji, když už použít nějaké klikátko, tak jen pro definici kostry na testovacícm schematu a posleze vzit DDL, přečíst, upravit a následně spustit nad skutečným schematem.&lt;br /&gt;
&lt;br /&gt;
=== Jména objektů v DB ===&lt;br /&gt;
Důležité upozornění pro uživatele přecházející z mySQL na pg je taktéž pojmenovávání objektů v databázi.&lt;br /&gt;
Zatímco mySQL je case-insensitive a tudíž je jedno jak si kterou tabulku, sloupeček apod pojmenujete, pg má pár zákonitostí, které Vám může připravit pár perných hodin/dní/měsíců/let :-) - (pozn. PostgreSQL je také case-insensitive, až na identifikátory zapsané v uvozovkách, viz dále)&lt;br /&gt;
&lt;br /&gt;
Sice to tady Pavel má, ale raději to zmíním ještě na tomto místě.&lt;br /&gt;
&lt;br /&gt;
Pokud definujete objekt v databázi a jeho jméno v definici uvedete do &amp;quot; je od té chvíle nutnost psát tyto &amp;quot; všude, kde s daným objektem pracujete. Další možností je nepsat &amp;quot; při vytváření těchto objektů, případně si zvyknout na psaní jmen objektů pouze malými písmeny. Bohužel, jak jsem již psal v předchozí části, různá klikátka Vám ty uvozovky v mnoha případech napíšou samy. V mnou používaném EMS pg Lite Manageru jsem asi 4 hodiny hledal, jestli se to nedá nějak vypnout, ale nenašel jsem tuto možnost.&lt;br /&gt;
== Tipy a triky ==&lt;br /&gt;
&lt;br /&gt;
=== Porovnávání řetězců co se podobnosti týče ===&lt;br /&gt;
Narazil jsem na problém, jak poznat zákazníky e-shopu podle jmen (ne vždy zákazník použije svůj login, ale zašle objednávku pod &amp;quot;novým účtem&amp;quot;). Byl jsem upozorněn na trigramy. Copak je to zajímavého ? Jelikož nejsem teoretik, řeknu na rovinu, že do hloubky netuším. Jelikož však samotný trigram mi přijde ne moc šikovný, je dobré nejprve řetězce zbavit balastu, to jest, mezer, českých znaků, a velkých písmen. Zde je výsledná funkce is_similar :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION &amp;quot;_global_&amp;quot;.&amp;quot;is_similar&amp;quot; (ppar1 varchar, ppar2 varchar) RETURNS boolean AS&lt;br /&gt;
$body$&lt;br /&gt;
DECLARE&lt;br /&gt;
  lpar1 varchar;&lt;br /&gt;
  lpar2 varchar;&lt;br /&gt;
  res boolean;&lt;br /&gt;
BEGIN&lt;br /&gt;
   res := false;&lt;br /&gt;
 &lt;br /&gt;
   lpar1 := lower(replace(to_ascii(encode(convert_to(ppar1, &amp;#039;latin2&amp;#039;),&amp;#039;escape&amp;#039;),&amp;#039;latin2&amp;#039;),&amp;#039; &amp;#039;,&amp;#039;&amp;#039;));&lt;br /&gt;
   lpar2 := lower(replace(to_ascii(encode(convert_to(ppar2, &amp;#039;latin2&amp;#039;),&amp;#039;escape&amp;#039;),&amp;#039;latin2&amp;#039;),&amp;#039; &amp;#039;,&amp;#039;&amp;#039;));&lt;br /&gt;
   IF lpar1=lpar2 THEN&lt;br /&gt;
    res := true;&lt;br /&gt;
   ELSE&lt;br /&gt;
    res := similarity(lpar1,lpar2) &amp;gt;= 0.3;&lt;br /&gt;
   END IF;&lt;br /&gt;
&lt;br /&gt;
   IF res IS NULL then&lt;br /&gt;
    res := false;&lt;br /&gt;
   END IF;&lt;br /&gt;
&lt;br /&gt;
   return res;   &lt;br /&gt;
END;&lt;br /&gt;
$body$&lt;br /&gt;
LANGUAGE &amp;#039;plpgsql&amp;#039; VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pascalisté a funkce v pg==&lt;br /&gt;
Jako letitý delphista a začínající uživatel databáze pgSQL mám dost často chybu v uložených procedurách.&lt;br /&gt;
V pgSQL se uložené procedury a funkce píší sice velmi obdobně (což právě může uživatele zmást), nicméně je zde par rozdílů.&lt;br /&gt;
=== Podmínky ===&lt;br /&gt;
Při psaní podmínek IF-THEN-ELSE-END je na rozdíl od pascalu potřeba psát i ; na konci vykonávaných řádků, stejně tak, jako se nevyužívá uvození begin-end.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Pascal:                                                        pg:&lt;br /&gt;
&lt;br /&gt;
  if &amp;lt;podminka&amp;gt; then                                           IF &amp;lt;podminka&amp;gt; THEN &lt;br /&gt;
    prikaz                                                        prikaz;&lt;br /&gt;
  else                                                         ELSE&lt;br /&gt;
    prikaz;                                                       prikaz;&lt;br /&gt;
                                                               END IF;&lt;br /&gt;
&lt;br /&gt;
  if (&amp;lt;podminka&amp;gt;) AND (&amp;lt;podminka&amp;gt;) then                        IF (&amp;lt;podminka&amp;gt;) AND (&amp;lt;podminka&amp;gt;) THEN&lt;br /&gt;
  begin                     &lt;br /&gt;
     prikaz1;                                                     prikaz1; &lt;br /&gt;
     prikaz2;                                                     prikaz2;&lt;br /&gt;
  end else                                                     ELSE&lt;br /&gt;
  begin  &lt;br /&gt;
    prikaz3;                                                      prikaz3;&lt;br /&gt;
    prikaz4;                                                      prikaz4;&lt;br /&gt;
  end;                                                         END IF;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Deklarace proměnných ===&lt;br /&gt;
Dalším rozdílem je deklarace proměnných. Zatímco v pascalu máte možnost deklarovat více proměnných stejného typu najednou - oddělené čárkami, v pg tato možnost není a je nutno deklarovat každou proměnnou zvlášť. Taktéž se v pg na rozdíl od pascalu nepoužívá : pro oddělení typu proměnné.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Pascal:                                                        pg:&lt;br /&gt;
&lt;br /&gt;
var prom1, prom2: String;                                      DECLARE prom1 VARCHAR;&lt;br /&gt;
    i1: Integer;                                                       prom2 VARCHAR;&lt;br /&gt;
                                                                       i1 INTEGER:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Pozor na RETURN ===&lt;br /&gt;
U příkazu RETURN je potřeba dát si pozor na dvě věci :&lt;br /&gt;
# Na rozdíl od pascalu a jeho proměnné result je RETURN příkazem, který nastaví návratovou hodnotu a UKONČÍ běh funkce.&lt;br /&gt;
# U funkce nesmí dojít k tomu, že RETURN nebude (z důvodu složitějších podmínek např) proveden.&lt;br /&gt;
&lt;br /&gt;
Osvědčil se mi následující postup :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DECLARE res VARCHAR;&lt;br /&gt;
BEGIN&lt;br /&gt;
   res := &amp;#039;nejaka navratova hodnota pro standartni chovani&amp;#039;;   &lt;br /&gt;
&lt;br /&gt;
   .... jadro funkce, misto RETURN zde staci nastavit res := &amp;#039;neco&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   RETURN res;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Raul</name></author>
	</entry>
</feed>