나는이 Perl로 작성 비 분기 게임 데몬 PostgreSQL의 9.3 데이터베이스에 쓰기 플레이어 통계에 쿼리 acync 사용합니다. 그러나 데이터베이스에서 무언가를 읽을 필요가있을 때 (플레이어가 금지되었거나 플레이어가 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
있습니까?