Ответ 1
Используйте PERFORM
и автоматическую переменную FOUND
:
PERFORM * FROM foo WHERE x = 'abc' AND y = 'xyz';
IF FOUND THEN
....
END IF;
Это будет успешным, если будет возвращена одна или несколько строк. Если вы хотите ограничить результат точностью до одной строки использовать GET DIAGNOSTICS
для получения числа строк или использовать SELECT INTO
для хранения count(...)
строк в переменную DECLARE
d, которую вы затем проверяете. Если это ошибка, чтобы получить никаких результатов, используйте SELECT INTO STRICT
, чтобы потребовать, чтобы ровно одна строка была получена и сохранена в целевой переменной.
Остерегайтесь проблем concurrency при выполнении чего-либо подобного. Если вы пытаетесь написать функцию upsert/merge, этот подход не будет работать. См. "почему это так сложно" .