Ben Perl ile yazılmış olmayan bir çatallama oyun cini bir PostgreSQL 9.3 veritabanına yazma oyuncu istatistiklerine sorguları acync kullanır. Ama veritabanından bir şey okumam gerektiğinde (bir oyuncunun yasaklanması veya oyuncunun VIP statüsü olması gibi), o zaman senkronize sorgular kullanırım.
Bu, değer veritabanından okunana kadar oyunu kısa bir süre durdurur.
Değerleri okumak için zaman uyumsuz sorguları kullanmak için oyun arka plan programımı yeniden yazamıyorum (denedim, ancak çok fazla değişiklik gerektirdi), bu yüzden sorum şu : birkaç alakasız sorguyu birleştirmek mantıklı mı (yeni bir oyuncu olduğunda yapmam gerekir) bağlanır) ve 1 Perl programına aynı anda birkaç değeri nasıl döndürebilirim?
Geçerli sorgularımın tümü parametre olarak bir oyuncu kimliği alır ve 1 değeri döndürür:
-- 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=?
Yukarıdaki sorguları birleştirmek için muhtemelen böyle bir prosedüre ihtiyacım var:
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;
Lütfen yukarıdaki prosedürü doğru bir şekilde beyan etmeme yardımcı olun.
NULL
yaTRUE
benim deis_banned
bu ifadeye değişkeni:select true into is_banned from pref_ban where id=_id
. Bunu değiştirmek için bir yolu var mıFALSE
yoksaTRUE
?