Ich habe einen nicht perkenden Spieledämon in Perl geschrieben , der Acync-Abfragen verwendet, um Spielerstatistiken in eine PostgreSQL 9.3-Datenbank zu schreiben. Wenn ich jedoch etwas aus der Datenbank lesen muss (z. B. wenn ein Spieler gesperrt ist oder wenn der Spieler einen VIP-Status hat), verwende ich synchrone Abfragen.
Dadurch wird das Spiel für einen kurzen Moment angehalten, bis der Wert aus der Datenbank gelesen wurde.
Ich kann meinen Spieledämon nicht umschreiben, um asynchrone Abfragen zum Lesen von Werten zu verwenden (ich habe es versucht, aber es waren zu viele Änderungen erforderlich). Meine Frage lautet daher : Wäre es sinnvoll, mehrere nicht verwandte Abfragen zu kombinieren (die ich bei einem neuen Spieler durchführen muss)? verbindet) mit 1 Prozedur und wie kann ich mehrere Werte gleichzeitig an mein Perl-Programm zurückgeben?
Meine aktuellen Abfragen verwenden alle eine Spieler-ID als Parameter und geben 1 Wert zurück:
-- 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=?
Um die obigen Abfragen zu kombinieren, benötige ich wahrscheinlich eine Prozedur wie diese:
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;
Bitte helfen Sie mir, das oben beschriebene Verfahren ordnungsgemäß zu deklarieren.
quelle
NULL
oderTRUE
in meineris_banned
Variablen mit dieser Aussage :select true into is_banned from pref_ban where id=_id
. Gibt es eine Möglichkeit, es inFALSE
oder zu ändernTRUE
?is_banned := exists(select 1 from pref_ban where id=_id)
sollte funktionieren, aber das ist eine andere Frage.Sie sollten einen zusammengesetzten Typ definieren . Sie können es als Rückgabetyp und für Datensatzvariablen innerhalb einer Funktion verwenden.
Beispiel:
Meiner Meinung nach ist die Verwendung solcher Funktionen sowohl hinsichtlich der Leistung als auch der Anwendungslogik durchaus sinnvoll.
Benutzerdefinierte zusammengesetzte Typen sind sehr nützlich, wenn Sie eine Reihe von Zeilen aus Ihrer Funktion zurückgeben möchten. Dann sollten Sie den Rückgabetyp der Funktion als definieren
setof composite-type
undreturn next
oder verwendenreturn query.
Beispiel:
quelle
OUT
Parametern erreicht im Grunde das Gleiche, ohne jedoch benutzerdefinierte Typen zu erstellenOUT
Parameter verwenden - aber wie sindSELECT
sie in meinem Fall von 4 nicht verwandten Abfragen?drop type if exists user_type cascade; create type user_type as(...);
da mein Perl-Skript die SQL-Anweisungen jedes Mal beim Start aufruft.