调试 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
您正在尝试 SELECT
从 tableName
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 ;
...
我正在尝试让这个 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
您正在尝试 SELECT
从 tableName
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 ;
...