如何将 SQL 查询返回值绑定到 psql 变量?

2024-01-02

背景:我正在写我的第一篇文章pgTAP http://pgtap.orgPL/pgSQL 函数的测试用例,并从小处开始使用 psql 测试脚本。没有问题,但我遇到了一个小烦恼psql变量 http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-VARIABLES.

在我的测试脚本中,我首先将大量测试数据转储到相关表中,然后使用由序列生成的主键引用数据。我发现能够创建一个包含主键的变量很方便。这就是我正在寻找的:

scalasb=> \set the_id (select currval('id_data_id_seq'))
scalasb=> \echo :the_id
54754
scalasb=> 

但这就是我得到的:

scalasb=> \set the_id (select currval('id_data_id_seq'))
scalasb=> \echo :the_id
(selectcurrval('id_data_id_seq'))
scalasb=> 

我有一个解决方法(请参阅下面的示例),但看起来 psql 变量不是适合这项工作的工具。或者它们只是与我在 Oracle sqlplus 中使用的不同绑定变量 http://www.adp-gmbh.ch/ora/sqlplus/use_vars.html ...

所以我的问题是:如何将 SQL 查询的返回值绑定到 psql 脚本中的变量中?

我正在使用 9.1 的 linux。

-- this is a simplified example to illustrate the problem
begin;

create table id_data(id serial primary key, data text not null);

create or replace function get_text(p_id bigint)
returns text
as $$
declare
  v_data constant text := data from id_data where id = p_id;
begin
  return v_data;
end;
$$ language plpgsql;

insert into id_data(data) values('lorem ipsum');

-- this works correctly but is a rather verbose (especially when one have
-- more of these, in the same query/function)
select get_text((select currval('id_data_id_seq')));

-- instead I'd like to set the id to a variable and use that but this
-- seems to be impossible with psql, right ?
\set the_id (select currval('id_data_id_seq'))
\echo First try: :the_id
--select get_text(:the_id); -- this will fail

-- this works and reveals psql variables' true nature - they are just a
-- textual replacements
\set the_id '(select currval(\'id_data_id_seq\'))'
\echo Second try: :the_id
select get_text(:the_id);

rollback;

恐怕你做不到 - 我为 psql 编写了一些补丁,但它不在核心中

您可以使用解决方法:

postgres=# \set myvar `psql -A -t -c "select version()" postgres `
postgres=# \echo :myvar
PostgreSQL 9.1.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5), 64-bit

Note:PostgreSQL 9.3 (2013) 及更新版本的支持\gset命令。使用此命令,上述解决方法是毫无根据的:

(2023-04-02 17:03:00) postgres=# select version() as myvar \gset
(2023-04-02 17:03:06) postgres=# \echo :myvar
PostgreSQL 16devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0), 64-bit
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 SQL 查询返回值绑定到 psql 变量? 的相关文章

随机推荐

  • Angular 2:让组件自动检测服务中的变量变化

    我目前面临的问题是 从功能上讲 当用户登录时 我的导航栏不会自动更新以向他们显示正确的链接 仅当我手动刷新不需要的页面时 它才会更新 因为这是单页面应用程序 我可以正常处理注销 因为注销按钮和功能位于控制导航栏的组件内 但是 登录是通过身份
  • C++ 中 _tmain() 和 main() 有什么区别?

    如果我使用以下 main 方法运行我的 C 应用程序 则一切正常 int main int argc char argv cout lt lt There are lt lt argc lt lt arguments lt lt endl
  • 分而治之——为什么它有效?

    我知道像归并排序和快速排序这样的算法使用分而治之的范式 但我想知道为什么它可以降低时间复杂度 为什么 分而治之 算法通常比非分而治之算法效果更好 分而治之的算法工作得更快 因为它们最终完成的工作更少 考虑二分搜索的经典分而治之算法 而不是看
  • 不需要播种 java.security.SecureRandom 吗?

    我使用的是 Java 1 7 如下面的代码所示 在 Ubuntu 中使用 Oracle 的 Java 7 编译器编译 java security SecureRandom似乎是不必要的 因为代码为两个伪随机序列的起始值生成两个不同的 Big
  • 我可以使用 Spring Data JPA 为 MappedSuperClass 的所有子级使用通用存储库吗?

    给定以下类结构 MappedSuperclass Inheritance strategy InheritanceType TABLE PER CLASS public abstract class Animal Entity public
  • Python 中正整数所需的最小位长度

    1 0b1 gt 1 5 0b101 gt 3 10 0b1010 gt 4 100 0b1100100 gt 7 1000 0b1111101000 gt 10 如何获取整数的位长度 即在 Python 中表示正整数所需的位数 在 pyt
  • 如何在python中转储不带引号的json

    这是我转储文件的方法 with open es hosts json w as fp json dump join host list keys fp 结果是 a b c 我想 a b c Thanks 在进行字符串替换之前 您可能需要st
  • 将 Pentaho Reporting Web 前端与自定义 Java/JSF 应用程序集成

    我有以下情况 带有数据的 OTLP 数据库架构 数据库过程将数据泵送到具有定义的维度和事实表的非规范化星型模式中 目标是构建 Web 应用程序 它可以对那些定义的数据结构进行汇总和深入分析 我可以构建自定义 Web 界面 但我更喜欢使用现有
  • 逻辑应用程序读取存储在变量中的json属性

    我在逻辑应用程序变量中有这个 json 我想要这个 JSON 的 id 属性并进一步使用 如何获取这个id属性值 我的 JSON 是 id 1 name John bright username Lily email email prote
  • 如何在ajax响应返回的脚本标签内执行javascript

    我正在发送一个 jquery get 请求 如下所示 get this attr href this serialize null script 我期望收到的响应将包含在脚本标签中 我知道浏览器不会执行响应 除非它返回时没有脚本标记 通常我
  • 元素 中“Project”属性的值“”无效。 vs2012

    我在尝试在 Visual Studio 2012 中加载某些项目时收到以下错误 G path project csproj error The value of the Project attribute in element
  • 如何在 VS Code 上设置 AngularDart5

    我已经广泛搜索了有关如何在 Visual Studio Code 上有效设置 Angular Dart 5 的文档 但到目前为止没有发现任何结论 我已经搜索过的地方 Youtube 堆栈溢出 https webdev dartlang or
  • Maven 与查询 DSL 集成

    我正在尝试将 Maven 中的现有项目与查询 dsl 集成 我添加了如下依赖项
  • .Net Core 中的 PagedList.Core.Mvc PagedListPager Html 扩展不存在

    似乎是PagedList Core不包含 Html helper 的扩展方法 所以我无法使用下面的代码 Html PagedListPager Model page gt Url Action Index new page PagedLis
  • 加载实体时的 nhibernate 竞争条件

    我的网络应用程序中存在休眠竞争条件问题 我知道在使用旧版本的 log4net 时会发生这种情况 应该在 1 2 10 中修复 尽管我也经历过这种情况 因此 我们暂时禁用了 log4net 因为竞争条件会导致 IIS 崩溃 并且在生产中发生这
  • Bazel 的 Mingw-w64 工具链 (Ubuntu 20.04.1 )

    我正在尝试使用 Bazel 在 Ubuntu 上为 mingw w64 创建工具链 我正在关注这个教程 https docs bazel build versions master tutorial cc toolchain config
  • 按 Enter 键后调用 onChange 事件

    我是 Bootstrap 的新手 并遇到了这个问题 我有一个输入字段 只要我输入一位数字 函数就会onChange被调用 但我希望当我输入整个号码后按 Enter 时调用它 验证函数也有同样的问题 它调用得太快 var inputProce
  • 在表格视图中组合静态和原型内容

    有没有办法使用故事板将静态表格视图单元格 静态内容 与动态表格视图单元格 原型内容 结合起来 我建议您将表格视为动态表格 但在顶部包含您始终想要的单元格 在故事板中 放置一个UITableViewController并让它使用动态表 添加任
  • 使用 Robolectric 和 Mockito 测试 CursorLoader

    鉴于我正在开发一个简单的 ListFragment 在本例中 它从 MediaStore 读取艺术家列表 但稍后也会从不同的源读取数据 如下所示 EFragment public class ArtistsFragment extends
  • 如何将 SQL 查询返回值绑定到 psql 变量?

    背景 我正在写我的第一篇文章pgTAP http pgtap orgPL pgSQL 函数的测试用例 并从小处开始使用 psql 测试脚本 没有问题 但我遇到了一个小烦恼psql变量 http www postgresql org docs