获取由函数复制的数据

时间:2019-04-19 19:32:52

标签: postgresql function transactions common-table-expression

我有一个非常复杂的数据结构,它位于几个表中。我有一个复制该结构的函数。我想在这样的单个查询中进行复制并获取新创建的数据:

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

成功创建了副本,但以上查询未返回该副本。我想它对于外部查询还是 committed 还是不可见的。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果不将其分为两个查询,恐怕是不可能的。

CTE不能帮您-Data-Modifying Statements in WITH(请参见cte内部更新表的示例):

  

... WITH中的子语句与每个子语句同时执行   其他和主要查询。因此,在使用数据修改时   WITH中的语句,指定的实际更新顺序   发生是不可预测的。所有语句都以相同的方式执行   快照(请参阅第13章),因此他们无法“看到”彼此的影响   在目标表上。这减轻了   行更新的实际顺序不可预测,这意味着   返回数据是沟通变更之间的唯一方法   不同的WITH子语句和主查询...

我想您也不能使用函数-Function Volatility Categories

  

对于用SQL或任何标准过程编写的函数   语言,还有一个由   波动率类别,即任何数据更改的可见性   由调用该函数的SQL命令生成。一种   VOLATILE函数将看到这样的更改,即STABLE或IMMUTABLE   功能不会。 ... VOLATILE函数可在以下位置获取新的快照   他们执行的每个查询的开始。