1

Temat: CREATE TABLE przez funkcje

Witam!

Potrzebuję napisać funkcję która utworzy tabelę o zdefiniowanej strukturze i nazwie podanej jako parametr smallint. Mam funkcję napisaną w języku SQL chciałbym zamiast NazwaZmiennej użyć parametru funkcji:

CREATE OR REPLACE FUNCTION f_sint_CreateTable_tbl(smallint) 
RETURNS void AS $$

CREATE TABLE NazwaZmiennej
(
  "dtDataGodzina" timestamp(0) without time zone NOT NULL,
  "idfkPojazd" smallint NOT NULL,
  "idfkAwarieSkroty" smallint NOT NULL,
  "sintNrBitu" smallint NOT NULL,
  "intWartosc" integer
)
WITH (OIDS=TRUE);

$$ LANGUAGE SQL;

Ostatnio edytowany przez WitekS (2009-03-02 16:13:15)

2

Odp: CREATE TABLE przez funkcje

Może użyj dynamicznego sqla np tak

CREATE OR REPLACE FUNCTION f_sint_CreateTable_tbl(varchar)
RETURNS void AS $$
begin
execute ' CREATE TABLE '||$1||'(
          dtDataGodzina timestamp(0) without time zone NOT NULL,
          idfkPojazd smallint NOT NULL,
          idfkAwarieSkroty smallint NOT NULL,
          sintNrBitu smallint NOT NULL,
          intWartosc integer
) WITH OIDS';
end;
$$ LANGUAGE plpgsql;

3

Odp: CREATE TABLE przez funkcje

Wielkie dzięki jest tylko jeden drobiazg jako parametr czyli nazwę  tabeli do utworzenia mam liczbę typu smallint którą zwraca mi inna funkcja żeby zadziałało muszę zrobić konwersję ze smallint na varchar albo w funkcji która zwraca albo w tej tylko nie wiem jak to zrobić. Szukałem informacji na temat PL/pgSQL niestety nie wiele znalazłem przykładów i informacji do MySQL jest dużo więcej.

4

Odp: CREATE TABLE przez funkcje

a co niby ten smallint ma przechowywac, nazwe tabeli? Nazwa tabeli ma byc liczba?

5

Odp: CREATE TABLE przez funkcje

No właśnie nazwą tabeli jest liczba którą zwraca mi funkcja. Tabela będzie wpisywana przez wyzwalacz jednak jeżeli takiej tabeli jeszcze nie będzie to muszę ją utworzyć. Nazwą tej tabeli będzie liczba typu smallint zwracana przez inną funkcję.

6

Odp: CREATE TABLE przez funkcje

Operator rzutowania w postgresie to :: np

select (1::smallint)::varchar;

Ale postgres jest dosc wrazliwy jesli chodzi o nazewnictwo tabel i pewnie bedziesz musial dodac " " w tym execute, polecenie tworzenia takiej tabeli z poziomu psql powinno byc

create table "123" (...)

Cos takiegop

create table 123 (..

raczej nie przejdzie

7

Odp: CREATE TABLE przez funkcje

wykombinowałem coś takiego ale coś tu jest nie tak:

CREATE OR REPLACE FUNCTION f_sint_CreateTable_tbl(smallint)
RETURNS void AS $$
DECLARE 
    str varchar;
begin
str:=($1::smallint)::varchar;
execute ' CREATE TABLE '||str||'(
          dtDataGodzina timestamp(0) without time zone NOT NULL,
          idfkPojazd smallint NOT NULL,
          idfkAwarieSkroty smallint NOT NULL,
          sintNrBitu smallint NOT NULL,
          intWartosc integer
) WITH OIDS';
end;
$$ LANGUAGE plpgsql;

testuję tak:

SELECT f_sint_CreateTable_tbl(1234);

i wywołaniu wywala błędy

8

Odp: CREATE TABLE przez funkcje

Jak sa bledy, znaczy trza poprawić smile. Może tak

CREATE OR REPLACE FUNCTION f_sint_CreateTable_tbl(smallint)
RETURNS void AS $$
DECLARE
    str varchar;
begin
        select ($1::smallint)::varchar into str;
        execute ' CREATE TABLE "'||str||'"(
          dtDataGodzina timestamp(0) without time zone NOT NULL,
          idfkPojazd smallint NOT NULL,
          idfkAwarieSkroty smallint NOT NULL,
          sintNrBitu smallint NOT NULL,
          intWartosc integer
        ) WITH OIDS';
end;
$$ LANGUAGE plpgsql;

Jedna uwaga jesli chcesz używać smallint to przy wywołaniu funkcji musisz rzutować argument np

select f_sint_CreateTable_tbl(112::smallint);

Jak tego nie zrobisz to przy wywolaniu

select f_sint_CreateTable_tbl(112);

postgres bedzie szukal funkcji z argumentem integer i zgłosi bląd bo definicji takiej nie ma (może warto zmienić typ ze smallint na integer)?

9

Odp: CREATE TABLE przez funkcje

Zmieniłem na integer dział jak trzeba. WIELKI SZACUNEK DLA WIEDZY Z POSTGRESA

CREATE OR REPLACE FUNCTION f_sint_CreateTable_tbl(integer)
RETURNS void AS $$
DECLARE
    str varchar;
begin
        select ($1::integer)::varchar into str;
        execute ' CREATE TABLE "'||str||'"(
          dtDataGodzina timestamp(0) without time zone NOT NULL,
          idfkPojazd smallint NOT NULL,
          idfkAwarieSkroty smallint NOT NULL,
          sintNrBitu smallint NOT NULL,
          intWartosc integer
        ) WITH OIDS';
end;
$$ LANGUAGE plpgsql;