调试 PL/pgSQL 函数

Debugging a PL/pgSQL function

我正在尝试让这个 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;

该函数的目标是遍历 a table 的所有列,删除缺失值百分比大于输入百分比的列。

我收到以下错误:

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

您正在尝试 SELECTtableName vaiable 存储的文本。你不能那样做,因为 Postgres 认为你想让他 table 来自 table 名为 tableName,但可能这样的 table 不存在。

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

DECLARE query TEXT;
...

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

EXECUTE query INTO percentage ;
...