2016-12-18 5 views
0

Ich habe eine Funktion und innerhalb dieser Funktion erstelle ich Variablen. Ich möchte die erstellte Variable als Schwellenwert für die Filterung verwenden.Referenzvariable in PL/pgSQL Funktion

CREATE OR REPLACE FUNCTION someF(a integer, b integer, c integer) 
RETURNS void AS 
$$ 
DECLARE 
    problematicVariable float := $1/$2; 

BEGIN 
    FOR i in 1 .. $3: 
    CREATE TABLE IF NOT EXISTS someTable AS 
     SELECT someFunction( 
      'SELECT id, 
      FROM yetAnotherTable st 
      WHERE st.agg <= problematicVariable') 
    END LOOP; 
END 
$$ 
language 'plpgsql'; 

Allerdings erhalte ich die Fehlermeldung, dass:

ERROR: column "problematicVariable" does not exist 

Wie würde ich Postgres sagen, dass dies nicht eine Spalte, sondern eine Variable I in dem Funktionskörper erstellt?

+1

'WHERE st.agg <= '|| problematicVariable) ' –

+0

Das Referenzieren einer Variablen ist das kleinste Ihrer Probleme. Division durch Null, Division durch Integer, 'SELECT' anstelle von' SELECT * ', wiederholte' CREATE TABLE' mit demselben Tabellennamen ... Ihr Ansatz ist ein großes Durcheinander. –

Antwort

1

Das Problem ist, dass der NameproblematicVariable in someFunction() interpretiert wird, wo es offensichtlich nicht definiert ist. Da dies ein stabiler Aufruf ist (der Funktionsparameter ist immer derselbe, so dass die gleichen Daten von der Funktion bei jedem Aufruf zurückkommen würden, unter der Annahme, dass keine Abhängigkeit von flüchtigen Werten besteht), ist es besser, dies aus der Schleife herauszunehmen und someF() wiederholt aufzurufen Ergebnis dieses ersten Funktionsaufrufs.

CREATE OR REPLACE FUNCTION someF(a integer, b integer, c integer) RETURNS someType AS $$ 
DECLARE 
    problematicVariable float := $1/$2; 
    idVar someType; 
BEGIN 
    SELECT id INTO idVar 
    FROM yetAnotherTable st 
    WHERE st.agg <= problematicVariable; 

    FOR i IN 1 .. $3 LOOP 
     CREATE TABLE IF NOT EXISTS someTable AS 
      SELECT someFunction(idVar); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 
+0

Sie kopieren mehrere Bugs aus dem Original ... –

+0

@ErwinBrandstetter Erleuchte mich. Die Logik im Code in der Frage macht keinen Sinn, der Codierungsstil ist "lose" und es gibt mehrere * mögliche * Pathologien, aber es gibt keine Fehler als solche. Wenn "b! = 0" angenommen wird und die erste Auswahl eine einzelne Zeile erzeugt, läuft der Code einwandfrei. Für mich scheint es, dass das OP schnell Code zusammengeflickt hat, der die Probleme zeigt, mit denen er konfrontiert war (die Funktionen 'someF()' und 'someFunction()' sehen für mich nicht wie echter Code aus) und Ich habe dieses spezielle Problem angesprochen, indem * tatsächliche * Bugs entfernt wurden. – Patrick

+0

Ich habe unter der Frage kommentiert. –

Verwandte Themen