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$;
Как добавить тест, чтобы быть уверенным возвращаемый номер_карты еще не существует (в таблице пациентов), и если он существует, то заставить al oop получить следующий номер диаграммы в таблице и т. д. c .., пока не будет найден неиспользуемый номер_карты? То есть триггер должен возвращать новые и неиспользованные номера_карт.
TIA
Примечание: мои первоначальные мысли заключаются в том, чтобы использовать рекурсивный cte, но подумайте прямо вперед l oop может быть быстрее?