我有一个用Perl编写的非分叉游戏守护进程,该守护进程使用acync查询将玩家统计信息写入PostgreSQL 9.3数据库。但是,当我需要从数据库中读取某些内容时(例如,如果某个播放器被禁止或该播放器具有VIP状态),那么我将使用同步查询。
这使游戏停止片刻,直到从数据库中读取了该值。
我无法重写游戏守护进程以使用异步查询来读取值(我尝试过,但是需要太多更改),所以我的问题是:合并几个不相关的查询(当一个新玩家使用时,我需要进行查询)是否有意义连接)到1过程,我如何同时向我的Perl程序返回几个值?
我当前的所有查询都以玩家ID作为参数并返回1值:
-- Has the player been banned?
select true from pref_ban where id=?
-- What is the reputation of this player?
select
count(nullif(nice, false)) -
count(nullif(nice, true)) as rep
from pref_rep where id=?
-- Is he or she a special VIP player?
select vip > now() as vip from pref_users where id=?
-- How many games has the player played to the end?
select completed from pref_match where id=?
为了结合以上查询,我可能需要这样的过程:
create or replace function get_user_info(_id varchar) returns XXX as $BODY$
declare
is_banned boolean;
reputation integer;
is_vip boolean;
completed_games integer;
begin
select 1 into is_banned from pref_ban where id=_id;
select
count(nullif(nice, false)) -
count(nullif(nice, true))
into reputation
from pref_rep where id=_id;
select vip > now() into is_vip from pref_users where id=_id;
select completed into completed_games from pref_match where id=_id;
return XXX; /* How to return 4 values here? */
end;
$BODY$ language plpgsql;
请帮助我正确声明以上过程。
NULL
或。有没有办法将其更改为或?TRUE
is_banned
select true into is_banned from pref_ban where id=_id
FALSE
TRUE