Gibt SETOF-Zeilen aus der PostgreSQL-Funktion zurück

7

Ich habe eine Situation, in der ich die Verbindung zwischen zwei Ansichten zurückgeben möchte. und das sind viele Spalten. Es war ziemlich einfach in SQL Server. Aber in PostgreSQL, wenn ich den Beitritt mache. Ich bekomme den Fehler "eine Spalte Definitionsliste ist erforderlich".

Gibt es eine Möglichkeit, dies zu umgehen, ich möchte nicht die Definitionen von zurückgebenden Spalten bereitstellen.

%Vor%     
user433023 25.07.2013, 17:32
quelle

1 Antwort

23

Sanitize-Funktion

Das Handbuch enthält alle Grundlagen für PL / pgSQL. Grundsätzlich kann das, was Sie haben, vereinfacht / bereinigt werden:

%Vor%
  • Sie benötigen keine weiteren Instanzen von BEGIN .. END im Funktionskörper außer, um einen separaten Codeblock mit seinem eigenen Bereich zu starten, der nur selten benötigt wird.

  • Der standardmäßige SQL-Verkettungsoperator ist || . + ist eine "kreative" Ergänzung Ihres früheren Anbieters.

  • Verwenden Sie nicht CaMeL-Fallbezeichner es sei denn, Sie zitieren sie doppelt. Am besten benutzt du sie überhaupt nicht:

  • varchar(4000) ist auch auf eine bestimmte Einschränkung von SQL Server zugeschnitten. Dieser Datentyp hat in Postgres keinerlei Performance-Vorteile. Verwenden Sie es nur, wenn Sie tatsächlich ein Limit von 4000 Zeichen benötigen. Ich würde einfach text verwenden - außer dass wir keine Variablen benötigen < em> überhaupt hier, nachdem ich die Funktion vereinfacht habe.

  • Wenn Sie format() noch nicht verwendet haben, konsultieren Sie das Handbuch hier .

Rückgabetyp

Nun zu Ihrer eigentlichen Frage: Der Rückgabetyp für eine dynamische Abfrage ist etwas knifflig, da SQL von der Funktion verlangt, dass sie einen genau definierten Typ zurückgibt. Wenn Sie in Ihrer Datenbank bereits eine Tabelle oder eine Ansicht oder einen zusammengesetzten Typ haben, der mit der Spaltendefinitionsliste übereinstimmt, die Sie zurückgeben möchten, können Sie einfach Folgendes verwenden:

%Vor%

Wenn Sie den Typ bei der Eingabe angeben, können Sie entweder anonyme Datensätze zurückgeben:

%Vor%

oder geben Sie eine Spalten-Definitionsliste mit (einfachste) RETURNS TABLE :

an %Vor%

Der Nachteil von anonymen Datensätzen: Sie müssen dann bei jedem Aufruf eine Spalten-Definitionsliste angeben, also verwende ich diese selten.

Ich würde SELECT * nicht verwenden, um damit zu beginnen. Verwenden Sie eine definitive Liste von Spalten, um zurückzukehren, und geben Sie Ihren Rückgabetyp entsprechend an:

%Vor%

Für vollständig dynamische Abfragen würde ich lieber eine einfache SQL-Abfrage verwenden. Keine Funktion.

Es gibt erweiterte Optionen, aber Sie müssen möglicherweise zuerst die Grundlagen studieren.

Erwin Brandstetter 25.07.2013, 18:14
quelle