【问题标题】: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函数的执行值?

谢谢。

【问题讨论】:

    标签: sql postgresql uuid psql


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2015-09-17
        • 2012-02-25
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多