Re: Various PostgreSQL questions

Поиск
Список
Период
Сортировка
От Christopher Kings-Lynne
Тема Re: Various PostgreSQL questions
Дата
Msg-id GNELIHDDFBOCMGBFGEFOIEJHCCAA.chriskl@familyhealth.com.au
обсуждение исходный текст
Ответ на Various PostgreSQL questions  (Marc SCHAEFER <schaefer@alphanet.ch>)
Список pgsql-sql
> Version: 7.1release-3.potato.1  (Debian package of 7.1release-3)

You should upgrade to 7.2.1 :)

> Question 1:
>    Apparently using NUMERIC(10, 2) in a type definition (DECLARE) of
>    a stored procedure in PL/pgSQL doesn't work; FLOAT works instead.
>    Is this normal ?

Don't know the answer to that one.  If it doesn't, it's a bug I guess...

> Question 2:
>    How can I implement a constraint which would always ensure the
>    SUM(money_amount) WHERE type = 1 in a specified table is always
>    zero ?

The best way is CREATE ASSERTION (which Postgres doesn't have yet :) )

>    I tried that:
>
>       CREATE FUNCTION f_ecriture_balance_check ()
>          RETURNS opaque
>          AS 'DECLARE amount FLOAT;
>              BEGIN
>                 amount := 0;
>                 SELECT SUM(montant_signe)
>                    FROM ecriture
>                    WHERE (lot = NEW.lot)
>                 INTO amount;
>
>                 IF (CAST(amount AS NUMERIC(10,2)) != -
> NEW.montant_signe) THEN
>                    RAISE EXCEPTION ''Sum of ecritures in lot is
> not zero'';
>                 END IF;
>
>                 RETURN new;
>              END;'
>          LANGUAGE 'plpgsql';
>
>       -- TODO
>       --    - STATEMENT instead of ROW when supported by PostgreSQL
>       CREATE TRIGGER t_ecriture_balance_insert
>          BEFORE INSERT
>          ON ecriture
>          FOR EACH ROW
>          EXECUTE PROCEDURE f_ecriture_balance_check ();
>
>    Of course this is only for INSERT (UPDATE and DELETE are modified).
>    Should I use SET CONSTRAINTS ALL DEFERRED within a transaction ?
>    This function always fails: I assume it gets called for each of the
>    row and not for the final state at the end of the transaction.

Maybe - give it a try!  It sounds like it should work...

> Question 3:
>    The following works, once. The second time it doesn't work (in the
>    same session/backend, see below for the error).

Unfortunately there are known problems with temporary relations in stored
procedures.  I believe there's talk of fixing it, but apparently it's a
tricky problem.  I can't remember what the workaround was...

> Question 4:
>    Is it possible to parametrize the table of a SELECT ?
>
>       SELECT * FROM $1  # for example.

Nope.  But there are patches flying around for 7.3/7.4 that implement such a
thing.  It's not certain whether they'll be in the release any time soon
though...

Chris



В списке pgsql-sql по дате отправления:

Предыдущее
От: Marc SCHAEFER
Дата:
Сообщение: Various PostgreSQL questions
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Various PostgreSQL questions