SET @stmt in Postgresql

Moin,

ich migiriere gerade von Mysql zu Postgresql und muss die Prozeduren/Funktionen umschreiben. Nun hänge ich aber an folgenden:

SET @blubb_stmt = CONCAT("SELECT @blubb_get_data_von:=calculate_blubb(blubb1) AS `cb` FROM blubb_data b WHERE (");
    SELECT CONCAT(@blubb_stmt, 'OR') INTO @blubb_stmt;  
    PREPARE blubb_stmt FROM @blubb_stmt;
    EXECUTE blubb_stmt;
    DEALLOCATE PREPARE blubb_stmt;

Wie bekomme ich dies am besten zu Postgresql übersetzt? Die Dokumentation von Postgresql hat mir da leider nicht weiter geholfen :confused:

Grüße
betaros

Da wird dynamisch ein SQL Statement zusammengebaut.

Wenn ich den Code richtig verstehe, kommt dabei aber ein unvollständiges Statement heraus:

Die Zeile: SET @blubb_stmt = CONCAT(“SELECT @blubb_get_data_von:=calculate_blubb(blubb1) AS cb FROM blubb_data b WHERE (”);
Schreibt den folgenden Wert in die Variable: SELECT @blubb_get_data_von:=calculate_blubb(blubb1) AS cb FROM blubb_data b WHERE (

Die nächste Zeile SELECT CONCAT(@blubb_stmt, ‘OR’) INTO @blubb_stmt;
hängt einfach nur ein OR dran.
Also ist das Resultat in der Variable dann: SELECT @blubb_get_data_von:=calculate_blubb(blubb1) AS cb FROM blubb_data b WHERE ( OR
Das ist aber kein korrektes SQL statement (nichtmal in MySQL). Da kann was nicht stimmen - vermutlich hast Du uns nicht alles gezeigt.

Grundsätzlich brauchst Du für dynamisches SQL eine stored function in PL/pgSQL.

So wie ich das sehe wird da einfach nur eine Funktion aufgerufen und das Ergebnis in eine Variable gespeichert, beispiele dafür sind im Handbuch zu finden:
http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

Ja da fehlt ein wenig. Ich hab das zum großen Teil verfremdet… aber die Grundstruktur ist gleich geblieben.

Ansich ist sieht die Funktion so aus, dass SET @stmt am Anfang steht und dann mehrere IF-Statements folgen, in denen die Befehle concatiniert werden. Der Link von dir scheint hilfreich zu sein, vielen Dank dafür.

Meine Idee ist jetzt die Befehle als Text in Variablen zu speichern und dann den Text mit Execute auszuführen. Dann kann ich mir das Prepare sicher sparen, glaube ich.

Edit: Meine Idee hat leider nicht funktioniert. :frowning: