2016-04-18 7 views
0

Ich versuche, diese PL/pgSQL-Funktion zu arbeiten:Debuggen eines PL/pgSQL Funktion

CREATE OR REPLACE FUNCTION loopcolumns2(tableName TEXT, pourcentage real) 
RETURNS void AS $$ 
DECLARE 
    _name text; 
    missing_percentage real; 
BEGIN 
    FOR _name IN SELECT column_name from information_schema.columns where table_name=tableName LOOP 
     SELECT 100 - (count(_name) * 100)/count(*) INTO missing_percentage FROM tableName; 
     IF (missing_percentage > pourcentage) 
      THEN ALTER TABLE tableName DROP COLUMN _name; 
     END IF; 
    END LOOP; 
END; $$ LANGUAGE plpgsql; 

Das Ziel der Funktion eine Schleife durch alle Spalten einer Tabelle, ein Löschen Sie die Spalten, in denen Der Prozentsatz der fehlenden Werte ist größer als ein Eingabe-Prozentsatz.

bekomme ich folgende Fehlermeldung:

SELECT 100 - (count($1) * 100)/count(*) FROM $2 
               ^
CONTEXT: SQL statement in PL/PgSQL function "loopcolumns2" near line 6 

Antwort

1

Sie sind von tableName vaiable zu SELECT von Text gespeichert versuchen. Sie können das nicht tun, weil Postgres denken, Sie wollen, dass er aus der Tabelle mit dem Namen tableName auswählen, aber wahrscheinlich existiert eine solche Tabelle nicht.

Sie müssen eine dynamische Abfrage in Zeichenfolge erstellen und EXECUTE ... INTO ... statement verwenden. Gefällt mir:

DECLARE query TEXT; 
... 

query := 'SELECT 100 - (count(' || _name::TEXT || ') * 100)/count(*) FROM ' 
      || tableName::TEXT; 

EXECUTE query INTO percentage ; 
... 
+0

Können Sie mir bitte Mre Details bitte? Wie kann ich '_name' und' table_name' immer noch als Variablen innerhalb des 'EXECUTE' verwenden? Vielen Dank –

Verwandte Themen