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

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

DDD
发布: 2025-01-22 23:31:12
原创
625 人浏览过

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查询并将结果作为具有明确定义的行类型的行集返回。

代码示例

假设您想根据表类型参数返回任何表的全部列:

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$;
登录后复制

用法

使用表类型作为第一个参数,ID作为第二个参数来调用该函数。该函数将返回指定表中具有给定ID的记录的所有列。

SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。
登录后复制

以上是PL/pgSQL 函数如何动态返回各种 SELECT 查询的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板