PostgreSQL:修改过程参数

Posted

技术标签:

【中文标题】PostgreSQL:修改过程参数【英文标题】:PostgreSQL: modifying procedure parameter 【发布时间】:2011-02-19 14:42:20 【问题描述】:

我有一个数据库表,游戏玩家可以在其中相互评分并留下可选评论(如果他们自己有足够好的“声誉”):

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
);

玩家的“声誉”是所有 fairnice 值的总和。

我正在尝试修改我的 PL/pgSQL 程序以创建此类评级,以便 about cmets 只能由“reputation” >= 30 且 good、fairnice 值只能由“声誉”> 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。

谢谢! 亚历克斯

【问题讨论】:

我不太擅长SQL,什么意思? id 引用另一个表 - pref_users,并且 id 是主键 我认为 Catcall 注意到 pref_rep 没有主键,或者可能在 id 上没有索引。索引引用列是一个好主意,因为当引用的表发生变化时,数据库必须检查 FK。 【参考方案1】:

8.4 中的函数参数隐含为CONSTANT,除非它们是OUT 参数。我找不到在 8.4 文档中指定的位置,但我确实找到了一些关于从 Informix 到 PostgreSQL 的相关讨论:

http://archives.postgresql.org/pgsql-interfaces/2007-08/msg00020.php http://archives.postgresql.org/pgsql-interfaces/2007-08/msg00023.php

看起来你可以通过声明一个同名的局部变量来模拟一个可变函数参数:

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

当您将来查看它时,可能会有点笨拙并且可能会令人困惑,但也许这比其他选择更可取。

【讨论】:

【参考方案2】:

它在 PostgreSQL 9.0.2 中运行。也许升级是为了。

【讨论】:

以上是关于PostgreSQL:修改过程参数的主要内容,如果未能解决你的问题,请参考以下文章

修改PostgreSQL数据库的默认用户postgres的密码

org.postgresql.util.PSQLException:没有为参数 1 指定值。- Postgres

PostgreSQL:修改过程参数

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

如果修改postgresql的最大连接数

Postgresql 帐号密码修改方法