我有一个非常复杂的数据结构,它位于几个表中。我有一个复制该结构的函数。我想在这样的单个查询中进行复制并获取新创建的数据:
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)
),但是它将需要很多别名(许多表具有id
或name
列)。另外,我最终会在很多地方建立(读取)该数据结构。
如何在一个查询中调用该函数并使用其结果(以及所有副作用)?
答案 0 :(得分:2)
如果不将其分为两个查询,恐怕是不可能的。
CTE不能帮您-Data-Modifying Statements in WITH
(请参见cte内部更新表的示例):
... WITH中的子语句与每个子语句同时执行 其他和主要查询。因此,在使用数据修改时 WITH中的语句,指定的实际更新顺序 发生是不可预测的。所有语句都以相同的方式执行 快照(请参阅第13章),因此他们无法“看到”彼此的影响 在目标表上。这减轻了 行更新的实际顺序不可预测,这意味着 返回数据是沟通变更之间的唯一方法 不同的WITH子语句和主查询...
我想您也不能使用函数-Function Volatility Categories
:
对于用SQL或任何标准过程编写的函数 语言,还有一个由 波动率类别,即任何数据更改的可见性 由调用该函数的SQL命令生成。一种 VOLATILE函数将看到这样的更改,即STABLE或IMMUTABLE 功能不会。 ... VOLATILE函数可在以下位置获取新的快照 他们执行的每个查询的开始。