PostgreSQL - Schreiben dynamischer SQL in gespeicherter Prozedur, die eine Ergebnismenge zurückgibt

8

Wie kann ich eine gespeicherte Prozedur schreiben, die eine dynamisch erstellte SQL-Anweisung enthält, die eine Ergebnismenge zurückgibt? Hier ist mein Beispielcode:

%Vor%

Dieser Code gibt einen Fehler zurück:

%Vor%

Ich habe stattdessen andere Möglichkeiten ausprobiert:

%Vor%

Weg 1:

%Vor%

Weg 2:

%Vor%

In allen Fällen ohne Erfolg.

Letztendlich möchte ich eine gespeicherte Prozedur schreiben, die eine dynamische SQL-Anweisung enthält und die Ergebnismenge aus der dynamischen SQL-Anweisung zurückgibt.

    
prince 14.08.2012, 08:02
quelle

2 Antworten

21

Es gibt Raum für Verbesserungen:

%Vor%

Wichtige Punkte

  • PostgreSQL 8.4 führte die USING -Klausel für EXECUTE ein, was aus verschiedenen Gründen nützlich ist. Wiederholen Sie das Handbuch :

      

    Die Befehlszeichenfolge kann Parameterwerte verwenden, auf die in verwiesen wird   der Befehl als , , usw. Diese Symbole beziehen sich auf die Werte in   die USING -Klausel. Diese Methode ist oft dem Einfügen von Daten vorzuziehen   Werte in die Befehlszeichenfolge als Text: es vermeidet Laufzeit-Overhead von   Konvertieren der Werte in Text und zurück, und es ist viel weniger anfällig für   SQL-Injection-Angriffe, da keine Notwendigkeit besteht, zu zitieren oder zu entkommen.

    IOW, es ist sicherer und schneller als das Erstellen einer Abfragezeichenfolge mit Textdarstellung der Parameter, auch wenn mit quote_literal() bereinigt.
    Beachten Sie, dass , in der Abfragezeichenfolge auf die angegebenen Werte in der USING -Klausel, nicht auf die Funktionsparameter verweist.

  • Während Sie SELECT * FROM lookups.countries zurückgeben, können Sie die RETURN -Deklaration wie folgt vereinfachen:

    %Vor%

    In PostgreSQL gibt es automatisch einen zusammengesetzten Typ für jede Tabelle. Benutze es. Dies hat zur Folge, dass die Funktion vom Typ abhängt und Sie eine Fehlermeldung erhalten, wenn Sie versuchen, die Tabelle zu ändern. Tropfen & amp; Erstellen Sie die Funktion in einem solchen Fall neu.

    Dies kann oder auch nicht wünschenswert sein - im Allgemeinen ist es! Sie möchten auf Nebenwirkungen aufmerksam gemacht werden, wenn Sie Tabellen ändern. So wie Sie es haben, würde Ihre Funktion still brechen und beim nächsten Aufruf eine Ausnahme auslösen.

  • Wenn Sie eine explizite Standardeinstellung für die 2. Parameter in der Deklaration wie gezeigt, Sie können (müssen aber nicht) den Aufruf vereinfachen, falls Sie keine Obergrenze mit ends_with setzen wollen.

    %Vor%

    anstelle von:

    %Vor%

    Achten Sie in diesem Zusammenhang auf Überladen von Funktionen .

  • Zitieren Sie nicht den Namen der Sprache 'plpgsql' , auch wenn das toleriert wird (vorerst). Es ist eine Kennung.

  • Sie können eine Variable zur Deklarationszeit zuweisen. Speichert einen zusätzlichen Schritt.

  • Parameter sind in der Kopfzeile benannt. Lösche die unsinnigen Zeilen:

    %Vor%
Erwin Brandstetter 21.08.2012, 01:17
quelle
5

Verwenden Sie quote_literal () , um SQL-Injektion (!!!) und fixiere dein Angebotsproblem:

%Vor%

Dies ist in Version 9.1 getestet, funktioniert gut.

    
Frank Heikens 14.08.2012 08:57
quelle