PostgreSQL: изменение параметра процедуры - PullRequest
3 голосов
/ 19 февраля 2011

У меня есть таблица базы данных, где игроки могут оценивать друг друга, а также оставлять необязательный комментарий (если у них достаточно хорошая репутация):

create table pref_rep (
        id varchar(32) references pref_users(id) check (id <> author),
        author varchar(32) references pref_users(id),
        author_ip inet,
        good boolean,
        fair boolean,
        nice boolean,
        about varchar(256),
        last_rated timestamp default current_timestamp
);

"репутация" игрока - это сумма всех честных и хороших значений.

Я пытаюсь изменить процедуру PL / pgSQL для создания таких рейтингов, чтобы около комментариев могли создавать только пользователи с «репутацией»> = 30 и хорошо * 1013 Значения *, fair и nice могут устанавливать только пользователи с «репутацией»> 0:

create or replace function pref_update_rep(_id varchar,
        _author varchar, _author_ip inet,
        _good boolean, _fair boolean, _nice boolean,
        _about varchar) returns void as $BODY$
        declare
        rep integer;
        begin

        select
        count(nullif(fair, false)) +
        count(nullif(nice, false)) -
        count(nullif(fair, true)) -
        count(nullif(nice, true))
        into rep from pref_rep where id=_author;

        if (rep <= 0) then
                return;
        end if;

        if (rep < 30) then
                _about := null;
        end if;

        delete from pref_rep
        where id = _id and
        age(last_rated) < interval '1 hour' and
        (author_ip & '255.255.255.0'::inet) =
        (_author_ip & '255.255.255.0'::inet);

        update pref_rep set
            author    = _author,
            author_ip = _author_ip,
            good      = _good,
            fair      = _fair,
            nice      = _nice,
            about     = _about,
            last_rated = current_timestamp
        where id = _id and author = _author;

        if not found then
                insert into pref_rep(id, author, author_ip, good, fair, nice, about)
                values (_id, _author, _author_ip, _good, _fair, _nice, _about);
        end if;
        end;
$BODY$ language plpgsql;

К сожалению, я получаю ошибку:

ERROR:  "$7" is declared CONSTANT
CONTEXT:  compilation of PL/pgSQL function "pref_update_rep" near line 21

Это означает, что приведенное выше присваивание _about: = null; не выполнено.

Есть ли хороший способ заставить его работать или мне нужно ввести временную. переменная здесь?

Использование PostgreSQL 8.4.7 и CentOS Linux 5.5.

Спасибо! Alex

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Аргументы функции в 8.4 неявно CONSTANT, если они не OUT параметры.Я не могу найти, где это указано в документации 8.4, но я нашел какое-то уместное обсуждение перехода от Informix к PostgreSQL:

Похоже, вы можете смоделировать аргумент изменяемой функции, просто объявив локальную переменную с тем же именем:

create or replace function pref_update_rep(_id varchar,
        _author varchar, _author_ip inet,
        _good boolean, _fair boolean, _nice boolean,
        _about varchar) returns void as $BODY$
        declare
        rep integer;
        _author varchar := _author;
        begin

Возможно, это немного неуклюже и, возможно, сбивает с толку, когда вы смотрите на него вбудущее, но, возможно, это предпочтительнее, чем альтернативы.

0 голосов
/ 19 февраля 2011

Работает в PostgreSQL 9.0.2.Возможно обновление в порядке.

...