SELECT oder PERFORM in einer PL / pgSQL-Funktion

9

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 der articulo Zeile, die ich deklariert habe!

Ich benutze diese Aussage:

%Vor%

Und der Fehler, den ich bekomme, ist 42601, ein Syntaxfehler! Wie könnte es sein, wenn ich die IDE verwende, um es zu erstellen? Irgendeine Idee über das Problem?

    
dbncourt 12.04.2012, 00:21
quelle

2 Antworten

13

Im plpgsql-Code löst SELECT ohne Ziel einen Fehler aus. Aber offensichtlich nicht willst du SELECT INTO , du willst nur den Status von FOUND setzen. Sie würden PERFORM verwenden / a> dafür.

Besser, , verwenden Sie IF EXISTS ... . Betrachten Sie diese Neufassung Ihrer Funktion:

%Vor%

Über EXISTS :

Der andere wichtige Punkt :

  • Verwenden Sie die RETURNING -Klausel von die INSERT -Anweisung anstelle einer zusätzlichen SELECT .

Postgres 9.5 +

Verwenden Sie in Postgres 9.5 oder höher lieber stattdessen einen UPSERT: ( INSERT ... ON CONFLICT DO NOTHING ).
Sie hätten UNIQUE Einschränkungen für "Articulo"("Nombre", "idTipo", "idFamilia") und "ArticuloMarca"("idArticulo", "idMarca") und dann:

%Vor%

Dies ist schneller, einfacher und zuverlässiger. Die hinzugefügten Schleifen schließen verbleibende Racebedingungen mit gleichzeitigem Schreiben aus (während sie kaum Kosten hinzufügen). Ohne gleichzeitige Schreibvorgänge können Sie vereinfachen. Detaillierte Erklärung:

Nebenbei: Verwenden Sie legale, kleingeschriebene Bezeichner, um all die hässlichen doppelte Zitate .

    
Erwin Brandstetter 12.04.2012, 03:31
quelle
4

Diese Zeile sieht mir verdächtig und ist wahrscheinlich, was Ihre Trauer verursacht:

%Vor%

Sie führen innerhalb Ihrer Funktion eine SELECT aus, aber nichts mit den Ergebnissen. Sie müssen ein SELECT INTO wie zuvor in Ihrer Funktion ausführen.

    
Glenn 12.04.2012 02:46
quelle