Ich versuche, alle Daten zu einer Benutzer-ID aus einer Spieldatenbank zu löschen.
Es gibt eine Tabelle mit allen Spielen (jeweils gespielt von 3 Spielern):
%Vor%Und es gibt einen Tisch, auf dem Spieler Punkte für das Spiel Nr. 321 haben:
%Vor%Wenn ich die folgende SELECT INTO-Anweisung für die psql-Eingabeaufforderung von PostgreSQL ausprobiere, scheint sie wie erwartet zu funktionieren (und die temporäre Tabelle verschwindet, wenn die Sitzung geschlossen wird):
%Vor%Aber wenn ich versuche, meine PL / pgSQL-Prozedur zu erstellen, erhalte ich einen Fehler:
%Vor%Der Fehler:
%Vor%Warum (temporäre Tabellen sind hier nicht erlaubt?) und wo kann ich meine temporäre Liste der zu löschenden GIDs speichern?
(Und ich würde es vorziehen, "on delete cascade" nicht zu verwenden, da ich noch nicht daran gewöhnt bin und meine Skripte / Datenbank noch nicht darauf vorbereitet sind).
Sie können versuchen
%Vor%Sie könnten die temporäre Tabelle erstellen und dann die üblichen %code% als separate Operationen ausführen:
%Vor%Es gibt auch eine LIKE-Option, um TABELLE zu erstellen, wenn Sie eine Tabelle duplizieren möchten Struktur:
%code%
Die Klausel %code% gibt eine Tabelle an, aus der die neue Tabelle automatisch alle Spaltennamen, ihre Datentypen und ihre Nicht-Null-Einschränkungen kopiert.
Aber ich denke, Sie brauchen nur eine temporäre Tabelle, um einige IDs zu halten, also ist das wahrscheinlich Overkill.
%code% funktioniert wie erwartet außerhalb einer Prozedur :
[...] Diese Form von SELECT INTO ist in ECPG oder PL / pgSQL nicht verfügbar, weil sie die INTO-Klausel anders interpretieren.
%code% wird verwendet, um das Ergebnis eines SELECT in einer lokalen Variablen zu speichern in einem PostgreSQL-Verfahren :
Das Ergebnis eines SQL-Befehls, der eine einzelne Zeile (möglicherweise mehrere Spalten) ergibt, kann einer Datensatzvariablen, einer Zeilentypvariablen oder einer Liste von Skalarvariablen zugewiesen werden. Dazu schreiben Sie den Basis-SQL-Befehl und fügen eine %code% -Klausel hinzu.
Neben dem expliziten Erstellen einer temporären Tabelle und dem Einfügen in diese gibt es noch eine andere, einfachere richtige Methode: %code% als in den Dokumenten empfohlen :
Dieser Befehl ist funktional ähnlich wie %code% , aber es ist bevorzugt, da es weniger wahrscheinlich ist, mit anderen Verwendungen von die %code% -Syntax. Darüber hinaus bietet %code% eine Obermenge der von %code% angebotenen Funktionalität.
Für Postgres 9.1 oder höher siehe unten.
Es wäre auch effizienter, %code%
Und ja, wenn Sie die temporäre Tabelle nicht außerhalb der Funktion verwenden, fügen Sie %code% hinzu.
Wenn Sie alles zusammensetzen, könnte Ihre Funktion so aussehen:
%Vor%Im modernen Postgres ist das obige nur für komplizierte Operationen sinnvoll, wo Sie eine aktuelle temporäre Tabelle brauchen, um damit zu arbeiten - zum Beispiel um einen Index darüber zu erstellen, bevor Sie fortfahren.
In Postgres 9.1 oder höher verwenden Sie Daten modifizierende CTEs für einfache Fälle wie die vorliegende:
%Vor%