以函数为值执行 \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 命令的主要内容,如果未能解决你的问题,请参考以下文章