Использование переменной в функции PostgreSQL для удаления схемы - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать функцию на PostgreSQL, и у меня возникла проблема с использованием локальной переменной. Вот мой код:

DECLARE query RECORD;
DECLARE schema_name TEXT;
BEGIN
        FOR query IN SELECT * FROM context WHERE created_at + make_interval(days => duration) <= CURRENT_TIMESTAMP LOOP
            SELECT lower(quote_ident(query.title)) INTO schema_name;
            DROP SCHEMA schema_name CASCADE;
            DELETE FROM context WHERE id = query.id;  
        END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;

Запросы select и delete работают нормально, и я сделал тест, возвращающий значение schema_name переменная, и все в порядке.

Моя проблема с этой строкой:

DROP SCHEMA schema_name CASCADE;

Я получаю сообщение об ошибке, поскольку "схема" имя_схемы "не существует". Буду очень признателен за любые идеи о том, как использовать эту переменную для выполнения запроса на удаление.

1 Ответ

0 голосов
/ 24 апреля 2020

Для этого вам понадобится Dynami c SQL:

DECLARE 
  query RECORD;
BEGIN
  FOR query IN SELECT id, lower(title) as title 
               FROM context 
               WHERE created_at + make_interval(days => duration) <= CURRENT_TIMESTAMP 
  LOOP
    execute format('DROP SCHEMA %I CASCADE', query.title);
    DELETE FROM context WHERE id = query.id;  
   END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;

Я также удалил ненужный оператор SELECT, чтобы сделать заголовок строчным, лучше это сделать непосредственно в запросе.

Также: назначение переменной быстрее с :=, чем с select, поэтому:

schema_name := lower(quote_ident(query.title));

было бы лучше, если бы требовалась переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...