【发布时间】:2017-03-31 01:57:27
【问题描述】:
我需要在数据库的许多表(PostgreSQL 9.3.5)上运行相同的查询,并将表名作为参数传递给函数似乎是一件合乎逻辑的事情。阅读文档中的示例和众多 S.O.帖子,我还是不能确定。
使用这个最小的例子:
CREATE TABLE films (
code char(5),
kind varchar(10)
);
INSERT INTO films VALUES
('UA502', 'Comedy');
还有这个功能:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS void AS -- I know, void is not what I am after
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE plpgsql;
以下查询捕获了一些东西:
mydb=> SELECT foo('films');
foo
-----
(1 row)
但是因为我想检索一个表,所以我编辑第二行并重新创建函数,如下所示:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS TABLE(count integer) AS
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE plpgsql;
但是同样的查询没有捕获任何东西:
mydb=> SELECT foo('films');
foo
-----
(0 rows)
有人可以让我知道我在这里缺少什么以及如何继续吗?任何提示都非常感谢!
【问题讨论】:
-
你能试试这个吗? Return Table 查询中的 RETURN QUERY 而不是 EXECUTE 格式
-
关键是返回类型。如果您想要的只是一个整数列(计数),那么任务很简单。如果你想返回输入表的行,那就更复杂了。
-
谢谢@Erwin,我会记住这一点,因为我很快就会尝试到达那里。但对我来说,首先获得一些基本概念很重要。我觉得我什至无法进入“Hello World!”......
-
顺便说一句,问题标题与问题相矛盾,因为您不是返回一个表,只是一个值。不是集合返回函数,主体不同。
标签: postgresql plpgsql