我有数据库表,游戏玩家可以互相评价并留下可选评论(如果他们自己有足够好的“声誉”):
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程序以创建此类评分,因此约评论只能由“信誉”&gt; = 30且良好的用户创建,合理和漂亮值只能由具有“声誉”&gt;的用户设置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。
谢谢! 亚历
答案 0 :(得分:1)
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
当你在将来看到它时,或许可能会有点混乱,但也许这比其他选择更好。
答案 1 :(得分:0)
它在PostgreSQL 9.0.2中运行。也许升级是有序的。