调试PL / pgSQL函数

时间:2016-04-18 12:25:42

标签: sql postgresql plpgsql

我试图让这个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 个答案:

答案 0 :(得分:1)

您正试图通过tableName vaiable存储的文字Postgres。你不能这样做,因为tableName认为你希望他从名为DECLARE query TEXT; ... query := 'SELECT 100 - (count(' || _name::TEXT || ') * 100) / count(*) FROM ' || tableName::TEXT; EXECUTE query INTO percentage ; ... 的表中进行选择,但可能这样的表不存在。

您需要在字符串中创建动态查询并使用EXECUTE ... INTO ... statement。像这样:

{{1}}