【发布时间】:2023-03-18 09:17:01
【问题描述】:
PostgreSQL 11.1
我正在使用以下触发器从 chart_gap 表中获取“新”图表编号:
CREATE FUNCTION phoenix.next_chart()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
-- Check for empty chart number
IF NEW.chart_number is null or NEW.chart_number = 0 THEN
WITH ins AS (
SELECT chart_number
FROM chart_gap
WHERE pg_try_advisory_xact_lock(chart_number)
LIMIT 1
)
DELETE FROM chart_gap c
USING ins i
WHERE i.chart_number = c.chart_number
RETURNING i.chart_number INTO NEW.chart_number;
END IF;
RETURN NEW;
END;
$BODY$;
我将如何添加测试以确保返回的chart_number 不存在(在表患者中),如果存在,则强制循环以获取表中的下一个图表编号,等等...,直到找到未使用的chart_number?也就是说,触发器必须返回新的和未使用的chart_numbers。
TIA
注意:我最初的想法是使用递归 cte,但认为直接循环可能更快?
【问题讨论】:
标签: postgresql triggers recursive-cte