2016-04-18 17 views
0

PL/pgSQL関数のデバッグ:私が動作するように、このPL/pgSQL関数を取得しようとしています

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; 

機能の目標は、どこの列を削除し、テーブルのすべての列をループしています欠損値の割合は、入力の割合よりも大きいです。

私は次のエラーを取得する:

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

答えて

1

あなたはtableName vaiableによって保存されたテキストからSELECTしようとしています。 Postgresあなたは彼がtableNameという名前のテーブルから選択したいと思いますが、おそらくそのようなテーブルが存在しないため、あなたはそれを行うことはできません。

あなたは、文字列に動的なクエリを作成し、EXECUTE ... INTO ... statementを使用するnead。このように:

DECLARE query TEXT; 
... 

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

EXECUTE query INTO percentage ; 
... 
+0

よろしくお願いします。どのように私はまだ 'EXECUTE'内部変数として' _name'と 'table_name'を使用することができますか?ありがとうございました –

関連する問題