<?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=PgBash</id>
	<title>PgBash - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=PgBash"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PgBash&amp;action=history"/>
	<updated>2026-05-13T01:34:31Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=PgBash&amp;diff=204&amp;oldid=prev</id>
		<title>imported&gt;WikiSysop v 19. 4. 2006, 08:36</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PgBash&amp;diff=204&amp;oldid=prev"/>
		<updated>2006-04-19T08:36:25Z</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;[[category:Články]]&lt;br /&gt;
PgBash si můžete stáhnout jako binární soubor, nebo přeložit ze [http://www.psn.co.jp/PostgreSQL/pgbash/download-e.html zdrojových kódů]. Ty jsou ve formě patche pro bash, tudíž musíte mít k dispozici zdrojové kódy od odpovídající verze bashe.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb011;&lt;br /&gt;
SELECT jmeno FROM jmena; | less&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stejně jako používáme proměnné v příkazech shellu, můžeme proměnné použít v SQL příkazech. Pgbash rozšiřuje SQL příkaz SELECT o možnost přiřadit hodnotu sloupce proměnné shellu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb011;&lt;br /&gt;
SELECT COUNT(jmeno) INTO :pjmen FROM jmena &lt;br /&gt;
  WHERE jmeno LIKE &amp;#039;$1%&amp;#039;; &amp;gt; /dev/null&lt;br /&gt;
echo &amp;quot;Prefixem $1 začíná $pjmen jmen&amp;quot;&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Po provedení dotazu můžeme testovat &amp;quot;vestavěné&amp;quot; proměnné $SQLCODE, $SQLERRD2 a další. Pokud SQL příkaz skončil s chybou, pak $SQLCODE obsahuje číslo chyby, jinak obsahuje nulu (můžeme použít $SQL_OK). $SQLERRD2 obsahuje počet vrácených řádků.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb011;&lt;br /&gt;
SELECT c.relname FROM pg_catalog.pg_class c &lt;br /&gt;
  WHERE c.relkind = &amp;#039;r&amp;#039; AND pg_catalog.pg_table_is_visible(c.oid) &lt;br /&gt;
    AND c.relname = &amp;#039;mojetab&amp;#039;; &amp;gt; /dev/null&lt;br /&gt;
# tabulka se vytvori pouze v pripade, ze dosud neexistuje&lt;br /&gt;
if [ $SQLERRD2 = 0 ]; then&lt;br /&gt;
  CREATE TABLE mojetab (&lt;br /&gt;
    a integer,&lt;br /&gt;
    b integer&lt;br /&gt;
  );&lt;br /&gt;
fi&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Iterace po řádcích vrácené tabulky je možná pomocí kurzorů. Skript, který vypíše prvních $2 řádků z tabulky jména, vypadá následovně (prvním parametrem skriptu je prefix jmen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb011;&lt;br /&gt;
BEGIN;&lt;br /&gt;
DECLARE c CURSOR FOR &lt;br /&gt;
  SELECT jmeno FROM jmena WHERE jmeno LIKE &amp;#039;$1%&amp;#039;;&lt;br /&gt;
lines=1&lt;br /&gt;
FETCH IN c INTO :jmeno;&lt;br /&gt;
while [ $SQLCODE -eq $SQL_OK ]; do&lt;br /&gt;
  if [ $lines -gt $2 ] ; then&lt;br /&gt;
    break&lt;br /&gt;
  fi&lt;br /&gt;
  echo $jmeno&lt;br /&gt;
  let &amp;quot;lines+=1&amp;quot;&lt;br /&gt;
  FETCH IN c INTO :jmeno;&lt;br /&gt;
done&lt;br /&gt;
END;&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pgbash můžeme použít pro tvorbu automatizovaných instalačních skriptů včetně plnění údaji - (pgbash podporuje dynamické přepínání připojení), v jednom připojení můžeme číst tabulku, ve druhém zapisovat přečtené řádky do tabulky.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb1@kix as db1;&lt;br /&gt;
connect to testfce as db2;&lt;br /&gt;
&lt;br /&gt;
set connection db2;&lt;br /&gt;
&lt;br /&gt;
BEGIN;&lt;br /&gt;
  DECLARE c CURSOR FOR&lt;br /&gt;
  SELECT * FROM t1;&lt;br /&gt;
  FETCH IN c INTO :c1, :c2;&lt;br /&gt;
  while [ $SQLCODE -eq $SQL_OK ]; do&lt;br /&gt;
    set connection db1;&lt;br /&gt;
    INSERT INTO t1 VALUES($c1,\&amp;#039;$c2\&amp;#039;);&lt;br /&gt;
    set connection db2;&lt;br /&gt;
    FETCH IN c INTO :c1, :c2;&lt;br /&gt;
  done&lt;br /&gt;
END;&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prostřednictvím pgbashe můžeme automatizovat administraci databází nebo systému. Při automatizaci administrace databáze můžeme využít periodické spouštění aplikací (cron), přístup k souborovému systému (exporty a importy), přístup k systémovým proměnným. Pokud použijeme pgbash pro administraci systému, tak pravděpodobně v těch případech, kdy výchozí data budou uložena v některé databázi (seznam uživatelů, seznam počítačů atd).&lt;br /&gt;
&lt;br /&gt;
Následující příklad ruší ty databáze, jejichž jméno vlastníka vyhovuje podmínce LIKE. Uvádím dvě varianty příkazu. První využívá faktu, že SQL příkaz lze vyhodnotit pomocí ``. Výsledkem je pak řetězec obsahující víceřádkový text. Druhá varianta používá kurzor. Jelikož kurzor můžeme používat pouze v transakci a při otevřené transakci nelze použít příkaz DROP DATABASE, musí skript obsahovat dva cykly.&lt;br /&gt;
&lt;br /&gt;
varianta 1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to template1;&lt;br /&gt;
&lt;br /&gt;
set option_header=off;&lt;br /&gt;
set option_bottom=off;&lt;br /&gt;
set option_alignment=off;&lt;br /&gt;
set option_separator=;&lt;br /&gt;
&lt;br /&gt;
dblist=`SELECT d.datname FROM &lt;br /&gt;
          pg_catalog.pg_database d LEFT JOIN pg_catalog.pg_user u &lt;br /&gt;
          ON d.datdba = u.usesysid WHERE u.usename LIKE &amp;#039;$1&amp;#039;;`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$dblist&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
  echo &amp;quot;$dblist&amp;quot; | while read db; do&lt;br /&gt;
    echo &amp;quot;Odstranuji databazi $db&amp;quot;&lt;br /&gt;
    DROP DATABASE \&amp;quot;$db\&amp;quot;;&lt;br /&gt;
  done&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
varianta 2.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to template1;&lt;br /&gt;
&lt;br /&gt;
BEGIN;&lt;br /&gt;
DECLARE c CURSOR FOR &lt;br /&gt;
        SELECT d.datname FROM &lt;br /&gt;
          pg_catalog.pg_database d LEFT JOIN pg_catalog.pg_user u &lt;br /&gt;
          ON d.datdba = u.usesysid WHERE u.usename LIKE &amp;#039;$1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
FETCH IN c INTO :dbname;&lt;br /&gt;
while [ $SQLCODE -eq $SQL_OK ]; do&lt;br /&gt;
  dblist=&amp;quot;$dblist \&amp;quot;$dbname\&amp;quot;&amp;quot;&lt;br /&gt;
  FETCH IN c INTO :dbname;&lt;br /&gt;
done&lt;br /&gt;
END;&lt;br /&gt;
eval &amp;#039;for i in &amp;#039;&amp;quot;$dblist&amp;quot;&amp;#039;; do eval &amp;quot;DROP DATABASE&lt;br /&gt;
       \&amp;quot;$i\&amp;quot;;&amp;quot;; done&amp;#039;&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jestliže budeme chtít 1. března zrušit všechny databáze uživatelů groupxx, pak přidáme do tabulky cronu (příkazem cron -e) řádek (předpokládám, že je skript uložen v souboru dropdbs.psh):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      0 0 1 3 * dropdbs.psh group% &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pgbash může použít jako wrapper plpgsql procedur - skript pgbashe můžeme použít jako jednoduchý interface zprostředkovávající předání parametrů uložené proceduře.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to template1&lt;br /&gt;
SELECT drop_students_databases($1) INTO :zd;&lt;br /&gt;
if [ $SQLCODE = $SQL_OK ]; then&lt;br /&gt;
  echo &amp;quot;Celkem bylo zruseno $zd databází&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
disconnect all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Také lze v pgbashi vytvářetjednoduché CGI skripty - pgbash obsahuje mod pro CGI, kdy jsou výstupy zformátovány do HTML tabulky.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/local/bin/pgbash&lt;br /&gt;
connect to testdb011;&lt;br /&gt;
echo &amp;quot;Content-type: text/html&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
set EXEC_SQL_OPTION CGI;&lt;br /&gt;
echo &amp;quot;&amp;lt;HTML&amp;gt;&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;lt;BODY&amp;gt;&amp;quot;&lt;br /&gt;
SELECT * FROM jmena WHERE jmeno LIKE &amp;#039;S%&amp;#039;;&lt;br /&gt;
echo &amp;quot;&amp;lt;/BODY&amp;gt;&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;lt;/HTML&amp;gt;&amp;quot;&lt;br /&gt;
disconnect all;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pgbash lze použít jako wraper SQL příkazů - můžeme napsat rozhraní pro libovolný SQL příkaz (viz. příklad na začátku článku). Bohužel pgbash nepodporuje nastavení formátování sloupců a tabulek (tak, jak jej podporuje např. SQL*Plus v RDBMS Oracle), a tak se zatím pgbash pro generování sestav (parametrizace příkazu SELECT) nedá použít. &lt;br /&gt;
&lt;br /&gt;
Pgbash rozhodně nenabízí takový editační komfort jako psql. Poslouží však tam, kde jsou schopnosti psql zatím nedostačující. Nabízí parametrizaci SQL příkazů a základní programové konstrukce (if, while, for). Dokud tato funkčnost nebude do psql doplněna, má pgbash rozhodně své místo na slunci a pro všechny, kteří denodenně používají PostgreSQL, se stane nenahraditelným pomocníkem.&lt;/div&gt;</summary>
		<author><name>imported&gt;WikiSysop</name></author>
	</entry>
</feed>