返回未定义类型的记录
原始函数声明的返回类型为text,但现在的目标是执行生成的SQL语句并将结果作为记录返回。为此,您需要使用动态SQL并处理返回尚未定义类型记录的问题。
具有数字和数据类型可变性的自定义类型
一种方法是创建一个自定义返回类型,其中列数固定,但数据类型可变。但是,这需要为每次调用定义列定义列表,当事先不知道列名和数据类型时,这变得不切实际。
使用多态类型
pg_typeof() 返回表名作为对象标识符类型(regtype)。当自动转换为文本时,标识符会自动用双引号括起来并进行模式限定,从而防止SQL注入。
RETURN QUERY EXECUTE
执行动态SQL并返回行的首选方法是RETURN QUERY EXECUTE。它允许您执行SQL查询并将结果作为具有明确定义的行类型的行集返回。
代码示例
假设您想根据表类型参数返回任何表的全部列:
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- 自动用双引号括起来并进行模式限定 WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
用法
使用表类型作为第一个参数,ID作为第二个参数来调用该函数。该函数将返回指定表中具有给定ID的记录的所有列。
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17); -- 将pcdmet替换为任何其他表名。</code>
以上是PL/pgSQL 函数如何动态返回各种 SELECT 查询的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!