【问题标题】:Return a select from a plpgsql function从 plpgsql 函数返回一个选择
【发布时间】:2012-05-30 04:22:18
【问题描述】:

我需要从 plpgsql 函数返回动态生成的选择语句。这是我目前所拥有的:

CREATE OR REPLACE FUNCTION qa_scf(cname character varying, tname character varying)
RETURNS text AS
$BODY$
BEGIN
return '* from ' ||tname|| 'where ' ||cname ||' != ''AL''';
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

调用者,从批处理文件中运行:

select qa_scf('state', 'testtable')

这会返回文字文本“qa_scf * from testtable where state != 'AL'”。我需要从一个 sql 批处理文件运行这个查询,但我似乎找不到正确的返回语句让这个函数返回一个字符串,然后让 sql 批处理执行它。我正在使用 Postgres 9.0。

【问题讨论】:

  • 问题可能出在这个函数的调用者如何处理结果上,而不是这个函数本身。
  • 我给了上面的调用者。这也是我的想法,但是没有人根据来电者给我答案。
  • 问题缺少的是调用者执行函数返回的SQL的方法。或者,如果您还没有完成它并且问题是“如何做”(=脚本中的动态 SQL),我建议 this answer

标签: sql postgresql plpgsql


【解决方案1】:

返回类型应该是 SETOF RECORD。执行并返回 SQL 将变为 RETURN QUERY EXECUTE。您的查询缺少 SELECT。在 where 之前也缺少空格。

CREATE OR REPLACE FUNCTION qa_scf(cname character varying, tname character varying)
RETURNS SETOF RECORD AS
$BODY$
BEGIN
    RETURN QUERY EXECUTE 'SELECT * from ' ||tname|| ' where ' ||cname ||' != ''AL''';
END;
$BODY$
LANGUAGE plpgsql;

调用此函数会有点复杂,因为您必须在结果中指定您期望的列。是这样的:

SELECT *
FROM qa_scf('foo', 'bar') AS t(col1_name col1_type, ...);

【讨论】:

  • returns table 现在应该比setof record 更受欢迎,因为它更易于使用(从中选择时无需指定表结构)
  • 可以,但是在创建函数使用returns表时不需要知道表结构是什么吗?
  • 这将用于具有 25-30 列的表格。这是一个很好的答案,但是每次都给出所有列名是极不可能的。我正在尝试创建此功能以删除某些查询的复制和粘贴,但似乎只是复制和粘贴它可能更容易。
  • 我也试图不在函数中执行查询,因为我遇到了问题,我只是想让它动态创建查询字符串,返回它,然后运行它在 SQL 批处理包装器字节中说“选择 qa_scf”
  • 你有没有找到任何有用的解决方案(我在这里遇到了完全相同的问题:stackoverflow.com/questions/43519641/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多