Я использую функцию, которая вставляет строку в таблицу, если она не существует, а затем возвращает идентификатор строки.
Всякий раз, когда я помещаю функцию в оператор SELECT
, с значения, которых еще нет в таблице, например:
SELECT * FROM table WHERE id = function(123);
... возвращает пустую строку. Однако повторный запуск с теми же значениями вернет строку со значениями, которые я хочу увидеть.
Почему это происходит? INSERT
работает на скорости SELECT
? Или PostgreSQL кэширует таблицу, когда она не существует, и при следующем запуске отображает результат?
Вот готовый пример использования этой проблемы:
CREATE TABLE IF NOT EXISTS test_table(
id INTEGER,
tvalue boolean
);
CREATE OR REPLACE FUNCTION test_function(user_id INTEGER)
RETURNS integer
LANGUAGE 'plpgsql'
AS $$
DECLARE
__user_id INTEGER;
BEGIN
EXECUTE format('SELECT * FROM test_table WHERE id = $1')
USING user_id
INTO __user_id;
IF __user_id IS NOT NULL THEN
RETURN __user_id;
ELSE
INSERT INTO test_table(id, tvalue)
VALUES (user_id, TRUE)
RETURNING id
INTO __user_id;
RETURN __user_id;
END IF;
END;
$$;
Позвоните:
SELECT * FROM test_table WHERE id = test_function(4);
Чтобы воспроизвести проблему, передайте любое целое число, которого еще нет в таблице.