select-into

___ qstntxt ___

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).

    
___ answer7934404 ___

Sie können versuchen

%Vor%     
___ tag123postgresql ___ PostgreSQL ist ein Open-Source-Objekt-relationales Datenbankmanagementsystem (ORDBMS), das für alle wichtigen Plattformen einschließlich Linux, UNIX, Windows und OS X verfügbar ist. Bitte geben Sie Ihre genaue Version von Postgres an, wenn Sie Fragen stellen. Fragen zur Administration oder erweiterten Funktionen richten Sie am besten auf dba.stackexchange.com. ___ qstnhdr ___ Verwenden der temporären Tabelle in der PL / pgSQL-Prozedur zum Bereinigen von Tabellen ___ answer7933277 ___

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.

    
___ tag123elektiere ___ hilf uns, dieses Wiki zu bearbeiten ___ tag123plpgsql ___ PL / pgSQL ist die Standardprozedursprache für PostgreSQL. Fragen zu PL / pgSQL sollten auch mit "PostgreSQL" getaggt werden. ___ answer7942187 ___

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% anstelle einer Unterauswahl.
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%

Daten modifizierendes CTE

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%     
___
2
Antworten

SELECT oder PERFORM in einer PL / pgSQL-Funktion

Ich habe diese Funktion in meiner Datenbank: %Vor% Aber sobald ich versuche, es zu benutzen, heißt es, dass ich PERFORM verwenden muss, wenn ich die Ergebnisse verwerfen möchte! Das Problem hier ist, dass ich nicht will! Ich möchte sie in...
12.04.2012, 00:21
2
Antworten

In der Datenbank befindet sich bereits ein Objekt namens 'tbltable1'

Ich versuche, Daten von einer Tabelle in eine andere mit derselben Struktur einzufügen, %Vor% Ich erhalte die folgende Fehlermeldung: %Vor%     
20.07.2009, 10:36
3
Antworten

Verwenden der temporären Tabelle in der PL / pgSQL-Prozedur zum Bereinigen von Tabellen

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...
28.10.2011, 17:52