繁体   English   中英

Postgres动态查询功能

[英]Postgres Dynamic Query Function

我需要创建一个函数,该函数将运行查询并以表名和列名作为给该函数的前景色返回结果。 我目前有这个:

CREATE OR REPLACE FUNCTION qa_scf(tname character varying, cname character varying)
RETURNS SETOF INT AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM tname WHERE cname !='AK' AND cname!='CK';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;

这在运行时给我错误“关系'tname'不存在”。 我是Postgres函数创建的新手,所以对您的帮助表示赞赏。 我觉得return int是错误的,但是我不知道要放什么使其返回返回行的所有列。 谢谢!

您不能使用变量代替这样的标识符。 您需要使用动态查询来完成。 它看起来像这样:

EXECUTE 'SELECT * FROM ' || quote_ident(tname) 
        || ' WHERE ' || quote_ident(cname) || ' NOT IN (''AK'',''CK'');'
INTO result_var;

如果您使用的是PostgreSQL 9.1或更高版本,则可以使用format()函数 ,该函数使构造此字符串更加容易。

在没有动态构造要作为动态语句执行的字符串的情况下,不能将表名和列名指定为参数或变量。 Postgres提供了有关执行动态语句的出色入门文档。 重要的是要使用quote_ident()quote_literal()正确引用标识符和文字。 format()函数有助于清理动态sql语句的构造。 由于您声明了要返回SETOF INTEGER的函数,因此应选择所需的整数字段,而不是*

CREATE OR REPLACE FUNCTION qa_scf(tname text, cname text)
RETURNS SETOF INTEGER AS
$BODY$
BEGIN
  RETURN QUERY EXECUTE format(
    'SELECT the_integer_field FROM %I WHERE %I NOT IN (%L,  %L)',
                                   tname,   cname,    'AK', 'CK'
  );
END;
$BODY$
LANGUAGE plpgsql;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM