Tôi có một trình nền trò chơi không giả mạo được viết bằng Perl , sử dụng truy vấn acync để ghi số liệu thống kê của người chơi vào cơ sở dữ liệu PostgreQuery 9.3. Nhưng khi tôi cần đọc thứ gì đó từ cơ sở dữ liệu (như nếu người chơi bị cấm hoặc nếu người chơi có trạng thái VIP), thì tôi sử dụng truy vấn đồng bộ.
Điều này làm cho trò chơi dừng lại trong một thời gian ngắn, cho đến khi giá trị đã được đọc từ cơ sở dữ liệu.
Tôi không thể viết lại trình nền trò chơi của mình để sử dụng các truy vấn không đồng bộ để đọc các giá trị (tôi đã thử, nhưng nó yêu cầu quá nhiều thay đổi), vì vậy câu hỏi của tôi là : có nên kết hợp một số truy vấn không liên quan (mà tôi cần thực hiện khi có người chơi mới kết nối) với 1 thủ tục và làm cách nào tôi có thể trả lại nhiều giá trị cùng lúc cho chương trình Perl của mình?
Tất cả các truy vấn hiện tại của tôi đều lấy ID người chơi làm tham số và trả về 1 giá trị:
-- 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=?
Để kết hợp các truy vấn trên có lẽ tôi cần một quy trình như thế này:
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;
Xin hãy giúp tôi khai báo đúng quy trình trên.
NULL
hoặcTRUE
trongis_banned
biến của mình với câu lệnh này :select true into is_banned from pref_ban where id=_id
. Có cách nào để thay đổi nó thànhFALSE
hayTRUE
?