У мене в Perl написаний демон , що не розгортається, який використовує acync запити для запису статистики гравців у базу даних PostgreSQL 9.3. Але коли мені потрібно прочитати щось із бази даних (наприклад, якщо гравця заборонено або якщо гравцю статус VIP), я використовую синхронні запити.
Це змушує гру зупинитися на короткий момент, поки значення не буде прочитане з бази даних.
Я не можу переписати свій ігровий демон, щоб використовувати запити асинхронізації для читання значень (я намагався, але це вимагало занадто багато змін), тому моє запитання : чи було б сенс поєднувати кілька непов'язаних запитів (що мені потрібно робити, коли новий гравець підключається) до 1 процедури і як я можу повернути кілька значень одночасно до моєї програми Perl?
Усі мої поточні запити приймають ідентифікатор гравця як параметр і повертають 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
?