我有一个更新数据(update_data
)的PL / pgSQL函数。在事务的上下文中,该函数可以被认为是幂等的,即,如果在同一事务中使用相同的参数调用该函数,则将以完全相同的方式修改数据。该函数实际上是多个upserts的包装器。以下是我的用例的简要版本:
CREATE FUNCTION top_level() RETURNS void AS $func$
BEGIN
-- ...
SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b, v_c;
PERFORM nested_one_level(/* ... */);
-- ...
END
$func$ LANGUAGE plpgsql;
CREATE FUNCTION nested_one_level() RETURNS void AS $func$
BEGIN
-- ...
SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b;
PERFORM nested_two_levels(/* ... */);
-- ...
END
$func$ LANGUAGE plpgsql;
CREATE FUNCTION nested_two_levels() RETURNS void AS $func$
BEGIN
-- ...
SELECT update_data(a => p_a, b => p_b) INTO v_a;
-- ...
END
$func$ LANGUAGE plpgsql;
请注意,在事务中,将始终使用相同的参数调用函数。但是,我使用了不同的INTO
条款。
多次调用update_data
函数的原因是某些嵌套函数可以通过其他RESTful路由独立使用。
据我所知,将update_data
的波动率水平设为STABLE
意味着(a)我们获得了潜在的绩效奖励,并且(b)我们避免必须缓存结果update_data
并传递它以便不再调用它,例如
IF p_update_data_results IS NOT NULL THEN
SELECT update_data(a => p_a, b => p_b) INTO v_a, v_b, v_c;
END IF;
由于docs:
中的以下内容,我只是犹豫不决任何带有副作用的功能必须标记为VOLATILE,以便无法优化对它的调用。
但我会假设,如果在同一事务中给定相同参数的副作用保证相同,那么使用STABLE
是否安全?
我使用Postgres 9.5.4 。