2

我正在编写一个简单的 plpgsql 函数来测试我必须使用 information_schema.columns 表在各种表上动态运行指标的想法。该函数工作正常,但是当我在 information_schema 表中使用 info 生成要传递给我的函数的表名时,我在标题中收到错误消息:

ERROR:  function cannot execute on segment because it accesses relation "my_table"

这是简单的功能(原理证明):

create or replace function count_rows(table_name text, column_name text)
returns bigint as $$
declare
    n bigint;
BEGIN
    execute 'select count(*) from (select ' || column_name || ' from ' || table_name || ') as t' into n;
    return n;
END;
$$ language 'plpgsql';

此查询(以及因此的功能)工作正常:

select * from count_rows('my_table','my_column');  -- works correctly!

但是使用来自 information_schema.columns 表的输入的查询失败并出现上述错误:

select table_name, column_name, count_rows(table_name, column_name) as num_rows
from information_schema.columns where table_name = 'my_table'; -- doesnt work

这个错误信息是什么意思?为什么不能这样查询information_schema中列出的表呢?

4

2 回答 2

1

看起来您可能正在使用 Greenplum。如果是这样,问题是函数无法访问表。

如果您遇到此问题,您必须将您的函数重写为视图,或者对函数中表选择中返回的值进行硬编码。在这种情况下,对结果进行硬编码是没有意义的,因此您需要查看是否可以使视图工作。

于 2014-11-04T22:18:12.293 回答
0

使用 quote_ident(tablename) & quote_ident(columnname) 而不是直接的 columnname 和 tablename,您应该需要访问所有表

于 2015-03-23T12:51:55.143 回答