以函数为值执行 \set 命令

Posted

技术标签:

【中文标题】以函数为值执行 \\set 命令【英文标题】:Execute \set command with function as value以函数为值执行 \set 命令 【发布时间】:2018-08-09 11:24:44 【问题描述】:

在我的一个 PostgreSQL SQL 脚本中,我想声明一个值,以便我可以在脚本其余部分的多个位置使用它。

这是我根据following thread 所做的:

\set cat_id uuid_generate_v4()
insert into categories (id, name) values (:cat_id, 'Category 1')
insert into other_table (id, category_id) values (uuid_generate_v4(), :cat_id)

问题是变量cat_id 不会一次性取值。它只是将:cat_id 替换为uuid_generate_v4()。因此,两次插入查询中的值是不一样的。

如何给cat_id函数的执行值?

谢谢。

【问题讨论】:

【参考方案1】:

:cat_id 包含uuid_generate_v4() 时,您将其用作宏。 \set psql 中的变量既可以用作宏,也可以用作变量。

问:如何给 cat_id 函数执行的值 ?

select uuid_generate_v4() as cat_id \gset

文档:

\gset [前缀] 将当前查询输入缓冲区发送到服务器并将查询的输出存储到 psql 变量(请参阅变量)。要执行的查询必须恰好返回一行。 行的每一列都存储在一个单独的变量中,命名与列相同。

请注意,之后将其注入到语句中,使用的语法是 :'cat_id',以便它被正确地引用为文字。

【讨论】:

【参考方案2】:

您可以使用匿名的DO 块和一个用新 UUID 初始化的变量。

DO
$$
DECLARE
  cat_id uuid = uuid_generate_v4();
BEGIN
  INSERT INTO categories
              (id,
               name)
              VALUES (cat_id,
                      'Category 1');
  INSERT INTO other_table
              (id,
               category_id)
              VALUES (uuid_generate_v4(),
                      cat_id),
END;
$$
LANGUAGE PLpgSQL;

【讨论】:

以上是关于以函数为值执行 \set 命令的主要内容,如果未能解决你的问题,请参考以下文章

shell中set命令

memcached数据库操作命令

限制函数或命令 PHP 的执行时间

以数组为值对哈希表进行排序

shell脚本怎么显示所执行的每一条命令

Memcached源码分析之从SET命令开始说起