#postgresql #postgresql-10
Вопрос:
Я новичок в PostgreSQL и хочу знать, почему моя временная таблица не удаляется после возврата, отличного от запроса на возврат.
Я могу выполнять эту функцию много раз без ошибки «таблица уже существует».
CREATE OR REPLACE FUNCTION test_table()
RETURNS TABLE (response JSON)
AS $
BEGIN
CREATE TEMP TABLE temp_test_table AS SELECT * FROM Users;
RETURN QUERY SELECT '{"name": "Moises"}'::JSON;
DROP TABLE temp_test_table;
END; $
LANGUAGE 'plpgsql';
Но в этом случае после первого выполнения я получаю сообщение «ОШИБКА: отношение «temp_test_json» уже существует».
CREATE OR REPLACE FUNCTION test_json()
RETURNS JSON
AS $
BEGIN
CREATE TEMP TABLE temp_test_json AS SELECT * FROM Users;
RETURN '{"name": "Moises"}'::JSON;
DROP TABLE temp_test_json;
END; $
LANGUAGE 'plpgsql';
Как запрос на возврат или просто возврат влияет на временную таблицу при удалении?
Ответ №1:
RETURN
завершает выполнение функции, поэтому выполнение не достигает DROP TABLE
оператора во второй функции.
Напротив, RETURN QUERY
добавляет строки в результирующий набор функций, но не завершает выполнение, поэтому DROP TABLE
выполняется в первой функции.
Комментарии:
1. Затем я предполагаю, что временная таблица всегда будет удалена до того, как функция получит какие-либо данные, если возвращаемый запрос не является окончательным возвращением.
2. Нет, результат кэшируется в памяти.