<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=147</link>
		<description><![CDATA[Najświeższe odpowiedzi w Jak sprawdzić w funkcji czy w bazie jest dana tabela.]]></description>
		<lastBuildDate>Wed, 11 Mar 2009 06:22:01 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=609#p609</link>
			<description><![CDATA[Nie wiem czy dziwna funkcja... nie znam postgres-a ani też składni plpgsql. Wcześniej miałem wszystko na MySQL-u i działało tak jak miało działać. W takim razie jak można wykonać takie zadanie. Przychodzi wpis do bazy do tabeli mt_read:
1. muszę sprawdzić  są wartości do wpisania i wykonać następne działania np. utworzyć tabelę jeżeli nie istnieje (to zadanie - sprawdzenie i utworzenie muszę chyba przenieść całkowicie do funkcji tworzącej tabele???)
2. w zależności od wartości liczby wpisywanej do mt_read muszę rozbić jeden wpis na kilka rekordów i wpisać je do tabeli utworzonej wcześniej która nazwa jest wyznaczona przez funkcję...
Jeżeli funkcja wyzwalacza może zwracać tylko trzy wartości new, old, null a po null kończy działanie to nie wiem jak mam wykonać ten wyzwalacz... :(]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Wed, 11 Mar 2009 06:22:01 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=609#p609</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=608#p608</link>
			<description><![CDATA[Dziwna troche ta funkcja. Musisz pamietac ze return powoduje wyjscie z funkcji. Jak masz w if'ie i else 'return null' to juz do tego 'return new' na koncu funkcji raczej nie dojdzie. Jestes pewien ze dobrze przemyslales dzialanie tej funkcji?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 10 Mar 2009 21:16:59 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=608#p608</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=606#p606</link>
			<description><![CDATA[To jest funkcja wywoływana po wstawieniu rekordu do mt_read a po przeanalizowaniu z tego rekordu mają być wpisywane (jeden bądź kilka w zależności od wartości) do tabel tworzonych jeżeli nie istnieją o nazwie zwracanej przez funkcję.
[code]-- Function: f_tri_ai_aktual_mt_read()

-- DROP FUNCTION f_tri_ai_aktual_mt_read();

CREATE OR REPLACE FUNCTION f_tri_ai_aktual_mt_read()
  RETURNS trigger AS
$BODY$

DECLARE 

licz INTEGER DEFAULT 0;
dg timestamp without time zone;
val INTEGER;
AwariaSkrot SMALLINT;
Pojazd INTEGER;
BitInfo SMALLINT; 
str VARCHAR;

BEGIN

dg := NEW.mt_time; 
val := NEW.mt_value;
AwariaSkrot := f_txt_AwariaSkrot_sint(NEW.mt_name);
Pojazd := f_txt_Pojazd_int(NEW.mt_name);
BitInfo := f_txt_BitInfo_sint(NEW.mt_name);

    SELECT INTO str tablename FROM pg_tables WHERE tablename='"'||Pojazd||'"';
        IF not found THEN
        PERFORM f_int_CreateTable_tbl(Pojazd);
        RETURN null;
    ELSE
        RETURN null;
        END IF;

IF (BitInfo = 0) THEN 
    EXECUTE 'INSERT INTO "'||Pojazd||'" ("dtDataGodzina", "idfkAwarieSkroty", "sintNrBitu", "intWartosc")
        VALUES (dg, AwariaSkrot, 0, val)';
RETURN NEW;
END IF;

IF (BitInfo = 16) THEN 
WHILE licz < 16 
LOOP
    IF ((val & (1<<licz))<>0) THEN 
        EXECUTE 'INSERT INTO "'||Pojazd||'" ("dtDataGodzina", "idfkAwarieGrupy", "sintNrBitu", "sintWartosc")
            VALUES (dg, AwariaSkrot, licz + 1, val & (1<<licz))';
    END IF;
    licz=licz+1;
END LOOP;

RETURN NEW;
END IF;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION f_tri_ai_aktual_mt_read() OWNER TO postgres;[/code]]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Tue, 10 Mar 2009 19:54:14 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=606#p606</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=604#p604</link>
			<description><![CDATA[To pokaż jak teraz wyglada cała funkcja.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 10 Mar 2009 17:06:30 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=604#p604</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=603#p603</link>
			<description><![CDATA[returns trigger bo muszę sprawdzić przy wstawieniu danych do tabeli mt_read do jakiej tabeli mam wpisać zmodyfikowany rekord i jeżeli taka tabela nie istnieje to utworzyć, nazwa tabeli jest numerem zwracanym na podstawie wpisywanego do mt_read rekordu przez funkcję:
[code]f_txt_Pojazd_int(NEW.mt_name);[/code]
Czyli z tego rozumiem że zamiast  RETURN 'created'; oraz RETURN 'already exists'; muszę napisać return null???;
Sprawdziłem działanie no i jest tak że jeżeli tabela nie istnieje to jest utworzona przez funkcję jednak jeżeli już jest to mam taki błąd:
[code]ERROR:  relation "3111" already exists
KONTEKST:  SQL statement " CREATE TABLE "3111"(
          dtDataGodzina timestamp(0) without time zone NOT NULL,
          idfkAwarieSkroty smallint NOT NULL,
          sintNrBitu smallint NOT NULL,
          intWartosc integer
        ) WITH OIDS"
PL/pgSQL function "f_int_createtable_tbl" line 5 at EXECUTE statement
SQL statement "SELECT  f_int_CreateTable_tbl( $1 )"
PL/pgSQL function "f_tri_ai_aktual_mt_read" line 22 at PERFORM[/code]]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Tue, 10 Mar 2009 12:32:49 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=603#p603</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=602#p602</link>
			<description><![CDATA[Przy return's trigger musisz zwracac

[code]return new;[/code]
lub
[code]return old;[/code]
lub
[code]return null;[/code]
Czemu masz returns trigger?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 10 Mar 2009 11:41:44 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=602#p602</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=601#p601</link>
			<description><![CDATA[Język jest w bazie zainstalowany w zasadzie nic nie zmieniałem a teraz przy próbie zapisania funkcji:
[code]CREATE OR REPLACE FUNCTION f_tri_ai_aktual_mt_read() RETURNS trigger AS

$$

DECLARE 

Pojazd INTEGER;
str VARCHAR;

BEGIN

Pojazd := f_txt_Pojazd_int(NEW.mt_name);


    SELECT INTO str tablename FROM pg_tables WHERE tablename='"'||Pojazd||'"';
        IF not found THEN
        PERFORM f_sint_CreateTable_tbl(Pojazd);
        RETURN 'created';
    ELSE
        RETURN 'already exists';
        END IF;

END;
$$
LANGUAGE PLPGSQL;[/code]
mam coś takiego
[code]ERROR:  RETURN must specify a record or row variable in function returning tuple at or near "'created'"
LINE 19:         RETURN 'created';
                    ^

********** Błąd **********[/code]]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Tue, 10 Mar 2009 06:50:59 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=601#p601</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=600#p600</link>
			<description><![CDATA[Bo dodalem niepotrzebnie kropke :) powinno byc.

[url]http://www.postgresql.org/docs/current/static/sql-createlanguage.html[/url]

Wpisz 
[code]select * from pg_language;[/code]
i bedziesz wiedzial czy masz zainstalowany w bazie jezyk.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Fri, 06 Mar 2009 19:46:38 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=600#p600</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=599#p599</link>
			<description><![CDATA[Używam windows xp a wcześniej wszystkie inne funkcje działały ;( link który podałeś nie dział więc spróbuję coś znaleźć na temat dodawania języka proceduralnego chociaż wydawało mi się że zaznaczyłem plpgsql przy instalacji...]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Fri, 06 Mar 2009 13:37:33 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=599#p599</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=598#p598</link>
			<description><![CDATA[Musisz utworzyć w bazie język plpgsql, aby móc go używać. Tu masz opisane jak [url]http://www.postgresql.org/docs/current/static/sql-createlanguage.html.[/url] Jeśli masz linux'a to z poziomu systemu wystarczy polecenie
[code]createlang plpgsql nazwa_bazy[/code]
Język jest tworzony wyłącznie w tej bazie w której go dodasz.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Fri, 06 Mar 2009 07:05:48 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=598#p598</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=597#p597</link>
			<description><![CDATA[Mam coś takiego:
[code]CREATE OR REPLACE FUNCTION f_tri_ai_aktual_mt_read() RETURNS trigger AS

$$

DECLARE 


Pojazd INTEGER;
str VARCHAR;

BEGIN

Pojazd := f_txt_Pojazd_int(NEW.mt_name);


    SELECT INTO str tablename FROM pg_tables WHERE tablename='"'||Pojazd||'"';
        IF not found THEN
        PERFORM f_sint_CreateTable_tbl(Pojazd);
        RETURN 'created';
    ELSE
        RETURN 'already exists';
        END IF;

END;
$$
LANGUAGE PLPGSQL;[/code]
No i dostaje taki komunikat:
[code]Use CREATE LANGUAGE to load the language into the database.[/code]
Coś mam nie tak tylko co?]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Fri, 06 Mar 2009 06:14:31 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=597#p597</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=594#p594</link>
			<description><![CDATA[Tak pg_tables to widok z tabeliami w bazie. $1 jak mówisz to pierwszy argument wywołania funkcji. W fukcjach plpgsql nie powinno się używać select'ów, które nigdzie nie zapisują swojego wyniku. Dlatego tu sztucznie wprowadziłem zmienną str aby przypisać jej nazwę tabeli jeśli istnieje. Zamiast sprawdzać czy str jest różne od null, możesz użyć składni "if not found" (lub "if found"), która przechowuje info o tym czy ostatnie wykonane zapytanie (ostatnie wykonane przed "if not found") coś  zwróciło lub nie.

Skrypt może wyglądać następująco

[code]CREATE OR REPLACE FUNCTION ex(smallint)
RETURNS varchar AS $$
DECLARE
    str varchar;
begin
        select into str tablename from pg_tables where tablename="$1";
        if not found then
           perform f_sint_CreateTable_tbl($1);
           return 'created';
else
        return 'already exists';
        end if;
end;
$$ LANGUAGE plpgsql;[/code]
Użyty perform to taki select, w którym nie interesuje nas zwracana wartość, dlatego nie trzeba jej nigdzie zapisywać. Tutaj interesuje nas wyłącznie utworzenie tabeli wiec dlatego użyłem perform.
Ponieważ funkcja powinna coś zwracać więc i w if i else jest "return". Równie dobrze mógłbyć jeden return na końcu funkcji (poza if/else).
Funkcja ex(..) zadziała oczywiście tylko wtedy gdy będzie juz utworzona funkcja  f_sint_CreateTable_tbl(..)
Mam nadzieje, że to Ci pomoże.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Thu, 05 Mar 2009 21:33:56 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=594#p594</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=589#p589</link>
			<description><![CDATA[Wszystko OK tylko nazwę tabeli mam w zmiennej Pojazd i jest typu INTEGER chyba powinno być tak [code]SELECT INTO str tablename FROM pg_tables WHERE tablename='"'||Pojazd||'"';[/code]
ale nie jestem pewny bo nie znam tych składni PL/pgSQL a dopiero zaczynam z PostgreSQL-em stąd moja prośba czy możesz nieco nakreślić działanie tego sprawdzenia? pg_tables to widok w którym są przechowywane informacje o tabelach w bazie w danym shemacie, $1 odwołuje się do parametru funkcji ex(smallint) a jakie zadanie ma zmienna str która chyba bez przypisania wartości ma wartość NULL???
W przypadku gdy tabela nie istnieje chciałbym ją utworzyć przez funkcję którą wcześniej napisałem
[code]f_int_CreateTable_tbl(Pojazd);[/code]
ale chyba musi to być inaczej napisane???]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Wed, 04 Mar 2009 06:13:05 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=589#p589</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=587#p587</link>
			<description><![CDATA[If' mozesz zaimplementowac tak

[code]CREATE OR REPLACE FUNCTION ex(smallint)
RETURNS varchar AS $$
DECLARE
    str varchar;
begin
        select into str tablename from pg_tables where tablename="$1";
        if not found then
          -- TABELA NIE ISTNIEJE
        else
          --TABELA ISTNIEJE
        end if;
end;
$$ LANGUAGE plpgsql;[/code]]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 03 Mar 2009 20:53:18 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=587#p587</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak sprawdzić w funkcji czy w bazie jest dana tabela]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=585#p585</link>
			<description><![CDATA[rzeczywiście składnia podobna do poprzedniej to pewnie zadziała tylko jak poprawnie sformułować ten kod:
[code]IF (tabela Pojazd nie istnieje) 
    THEN Utworzyc tabele Pojazd 
END IF;[/code]]]></description>
			<author><![CDATA[dummy@example.com (WitekS)]]></author>
			<pubDate>Tue, 03 Mar 2009 20:08:50 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=585#p585</guid>
		</item>
	</channel>
</rss>
