从函数返回记录集(虚拟表)

2024-02-20

我需要一个 Postgres 函数来返回一个包含自定义内容的虚拟表(就像在 Oracle 中一样)。该表有 3 列和未知的行数。

我只是在互联网上找不到正确的语法。

想象一下:

CREATE OR REPLACE FUNCTION "public"."storeopeninghours_tostring" (numeric)
  RETURNS setof record AS
DECLARE
  open_id ALIAS FOR $1;
  returnrecords setof record;
BEGIN
  insert into returnrecords('1', '2', '3');
  insert into returnrecords('3', '4', '5');
  insert into returnrecords('3', '4', '5');
  RETURN returnrecords;
END;

这句话怎么写才正确呢?


All previously existing answers are outdated or were inefficient to begin with.

假设你想返回三个integer列。

PL/pgSQL 函数

以下是如何使用现代 PL/pgSQL(PostgreSQL 8.4 或更高版本)执行此操作:

CREATE OR REPLACE FUNCTION f_foo() -- (open_id numeric) -- parameter not used
  RETURNS TABLE (a int, b int, c int) AS
$func$
BEGIN
RETURN QUERY VALUES
  (1,2,3)
, (3,4,5)
, (3,4,5)
;
END
$func$  LANGUAGE plpgsql IMMUTABLE ROWS 3;

在 Postgres 9.6 或更高版本中,您还可以添加PARALLEL SAFE https://www.postgresql.org/docs/current/sql-createfunction.html.

Call:

SELECT * FROM f_foo();

主要观点

  • Use RETURNS TABLE https://www.postgresql.org/docs/current/sql-createfunction.html定义要返回的临时行类型。
    Or RETURNS SETOF mytbl使用预定义的行类型。

  • Use RETURN QUERY https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING使用一个命令返回多行。

  • Use a VALUES https://www.postgresql.org/docs/current/sql-values.html表达式手动输入多行。这是标准 SQL 并且已经存在for ever.

  • If你实际上需要一个参数,使用参数名称(open_id numeric)代替ALIAS,这是不鼓励的 https://www.postgresql.org/docs/current/plpgsql-declarations.html#PLPGSQL-DECLARATION-ALIAS。在示例中,未使用参数,只是噪声......

  • 不需要双引号完全合法的标识符。仅在强制使用其他非法名称(大小写混合、非法字符或保留字)时才需要使用双引号。

  • 函数波动性可表示为IMMUTABLE https://stackoverflow.com/questions/28569415/how-do-immutable-stable-and-volatile-keywords-effect-behaviour-of-function/28573737#28573737,因为结果永远不会改变。

  • ROWS 3是可选的,但因为我们know返回了多少行,我们不妨向 Postgres 声明一下。可以帮助查询计划者选择最佳计划。

简单的SQL

对于像这样的简单情况,您可以使用普通的 SQL 语句:

VALUES (1,2,3), (3,4,5), (3,4,5)

或者,如果您想要(或必须)定义特定的列名称和类型:

SELECT *
FROM  (
   VALUES (1::int, 2::int, 3::int)
        , (3, 4, 5)
        , (3, 4, 5)
   ) AS t(a, b, c);

SQL函数

你可以将它包装成一个简单的SQL函数 https://www.postgresql.org/docs/current/xfunc-sql.html反而:

CREATE OR REPLACE FUNCTION f_foo()
   RETURNS TABLE (a int, b int, c int) AS
$func$
   VALUES (1, 2, 3)
        , (3, 4, 5)
        , (3, 4, 5);
$func$  LANGUAGE sql IMMUTABLE ROWS 3;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从函数返回记录集(虚拟表) 的相关文章

随机推荐

  • csproj 文件中的 XML

    任何人都可以向我指出 C csproj 文件中有效的架构或属性列表吗 我看过了 但似乎找不到任何有关它的文档 你的意思是像this http msdn microsoft com en us library dd576348 aspx文档
  • Keras 干扰 python 日志记录

    我想记录一些加载到经过训练的 keras 模型中的 python 代码 由于某种原因 python 日志记录在 keras 不工作的情况下不起作用load model是进口的 但是 如果我不导入 keras python 日志记录工作正常
  • PHP PDO + 准备语句

    sql SELECT phrase english FROM static site language WHERE page pds database gt pdo gt prepare sql pds gt execute array P
  • 弹出 Landscape-only 后 ViewController 的方向错误

    在基于导航的应用程序中 LandscapeViewController 仅支持横向模式 所有其他应用程序都支持两种模式 我还有一个 加载屏幕 建议用户在继续之前旋转手机 这样我可以确保当我的横向视图加载时 它处于横向模式 当我将手机旋转到纵
  • 偏航、俯仰和横滚分别与航向、俯仰和倾斜相同吗?

    我有两个不同的系统 引擎 A 引擎 B 发动机A 动机追踪软件 生成 偏航 俯仰 滚转 和发动机 B 4D影院 期望 航向 俯仰 坡度 我的研究得出的结果是这两个系统之间没有区别 Yaw Pitch Roll Heading Pitch B
  • React:为什么组件的构造函数只被调用一次?

    In the 下面的例子 http codepen io anon pen VYVPBJ when Item 2被点击 Second 1显示而不是Second 2 为什么 你会如何解决这个问题 var guid 0 class Conten
  • C# WinForms ListView 项目计数更改事件

    当 ListView 中的项目数发生变化时 Win Forms 中是否有一个事件可以触发 我尝试了 大小 和 文本 奇怪的是 它们 有点 有效 但并不总是 我试图触发一个标签来更新列表视图项目的计数 因为它发生变化 而无需在一百种方法中手动
  • 未找到 Browserify 命令

    简单的问题 当我从 mac 终端运行 browserify index js o app js 时 我得到命令未找到 我已经完成了 npm install g browserify 但仍然没有运气 知道我为什么会收到这个吗 谢谢 对我来说
  • Android:通过 adb shell am 启动应用程序信息对话框

    我正在尝试编写一个脚本 它将通过 adb 为我正在测试的应用程序启动 应用程序信息 系统对话框 我做了一些调查并提出了这个命令 它将启动 应用程序信息 但会因强制关闭而失败 logcat 中的 NullPointerException ad
  • “git config --list”显示重复的名称

    git config list显示两个值user name 一个全局 一个本地 user name My Name user name My Other Name 我的理解是 本地价值观优先于全球价值观 我怎样才能得到git config仅
  • 子div高度100%内部位置:固定div + 自动溢出

    我在尝试以下操作时遇到一些奇怪的行为 请参阅jsfiddle http jsfiddle net 9nS47 http jsfiddle net 9nS47 HTML div div div div div div div div div
  • JAR 中存在类,但仍然“无法找到或加载主类”

    我下载并安装了UMD 的 FindBugs 3 0 http findbugs sourceforge net downloads html in usr local share findbugs 3 0 ls usr local shar
  • 在android中的按钮上设置图像?

    我一直在尝试使用以下代码在按钮上设置图像 但它似乎不起作用 我认为我做错的是我正在使用的图像的路径 但我尝试了不同的路径 但它不会工作 我已将图像复制到 res 文件夹中的可绘制文件夹中 我在这里做错了什么 final Button nex
  • 将外部应用程序移动到屏幕前面

    我正在运行的应用程序需要调用单独的应用程序来进行一些扫描 我通过启动一个新的应用程序来调用另一个应用程序System Diagnostics Process 一旦获得该流程 我就会调用一个方法来让该应用程序获得焦点 我尝试了两种不同的方法来
  • 在 r 中跨多个数据帧应用一组操作

    我一直在为我的项目学习 R 但无法在 google 上找到我当前问题的解决方案 我有大约 100 个 csv 文件 需要对它们执行一组精确的操作 我已将它们作为单独的对象读取 我认为这可能是不正确的 r 风格 但我无法编写可以循环的函数 每
  • IText 2 + Flying Saucer:如何避免两个pdf页面之间的图像出现损坏?

    我有一个 html 文件 我正在使用 Itext 2 和飞碟将其转换为 pdf 文件 问题是 如果图像在页面末尾附近开始 飞碟会将其中的一部分渲染到当前页面的末尾 并将其余部分渲染到下一页的开头 怎么说我只想将整个图像放在一页上 您可以将其
  • 如何在 ASP.NET 应用程序中查询 Word docx?

    我想将 Word 2007 或更高版本的 docx 文件上传到我的 Web 服务器 并将目录转换为简单的 xml 结构 使用传统 VBA 在桌面上执行此操作似乎很容易 查看用于创建 docx 文件的 WordprocessingML XML
  • Jenkins - 使用 Git 插件请求登录凭据

    我有几个工作从 bitbucket 中提取代码并在 jenkins 中构建它 我使用 Git 插件来指定存储库 URL git 凭据 尽管我在每个作业配置中设置了凭据 但每次推送到 bitbucket 触发 jenkins 作业 时 Mac
  • 如何让 AVPlayer 在暂停时重绘当前 AVItem videoComposition

    我正在为 macOS 构建一个简单的视频编辑器 电影文件作为 AVAsset 加载 由 AVVideoComposition 中的一系列 CIFilter 进行转换 并由 AVPlayer 播放 我展示了 CIFilter 的一些参数的 U
  • 从函数返回记录集(虚拟表)

    我需要一个 Postgres 函数来返回一个包含自定义内容的虚拟表 就像在 Oracle 中一样 该表有 3 列和未知的行数 我只是在互联网上找不到正确的语法 想象一下 CREATE OR REPLACE FUNCTION public s