Удалите временную таблицу при выходе из функции, возвращающей JSON в PostgreSQL

#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. Нет, результат кэшируется в памяти.