获取函数复制的数据

问题描述 投票:0回答:1

我有一个非常复杂的数据结构,位于几个表中。我有一个功能,可以复制该结构。我想制作一个副本并在单个查询中获取新创建的数据,如下所示:

SELECT
    *
FROM
    main_table
    JOIN other_table
    ON (main_table.id = other_table.main_id)
WHERE
    main_table.id = make_copy(old_id);

副本已成功创建,但上述查询未返回。我猜它外部查询尚未显示或以某种方式提交。

我也试过使用WITH ... SELECT ...但没有成功......

函数make_copy(id)声明为VOLATILE,因为它修改了数据库,并且具有相同参数的多个调用将创建多个副本。

可能的解决方案可能是make_copy(id)函数将返回整个新的数据结构(SELECT * FROM make_copy(old_id)),但它需要许多别名(许多表有idname列)。另外,我最终会建立许多地方来构建(读取)数据结构。

如何在一个查询中调用该函数并使用其结果(和所有副作用)?

postgresql function transactions common-table-expression
1个回答
2
投票

如果不将它分成两个查询,我担心这是不可能的。

CTE无法帮助你 - Data-Modifying Statements in WITH(请参阅cte中更新表的示例):

... WITH中的子语句彼此同时并与主查询一起执行。因此,在WITH中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。所有语句都使用相同的快照执行(参见第13章),因此它们无法“看到”彼此对目标表的影响。这减轻了行更新的实际顺序的不可预测性的影响,并且意味着RETURNING数据是在不同的WITH子语句和主查询之间传递更改的唯一方式...

我想你不能用功能做到这一点 - Function Volatility Categories

对于用SQL或任何标准过程语言编写的函数,存在由波动率类别确定的第二个重要属性,即调用该函数的SQL命令所做的任何数据更改的可见性。 VOLATILE函数会看到这样的变化,STABLE或IMMUTABLE函数不会。 ... VOLATILE函数在它们执行的每个查询开始时获取一个新的快照。

© www.soinside.com 2019 - 2024. All rights reserved.