首页 >数据库 >mysql教程 >PL/pgSQL 函数如何动态返回各种 SELECT 查询的结果?

PL/pgSQL 函数如何动态返回各种 SELECT 查询的结果?

DDD
DDD原创
2025-01-22 23:31:12556浏览

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

重构PL/pgSQL函数以返回不同SELECT查询的输出

动态SQL和返回类型

返回未定义类型的记录

原始函数声明的返回类型为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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn