pgSQL, оператор динамических удаленных таблиц

Я хочу динамически удалить некоторые таблицы из базы данных. Сначала я выбираю их, а затем пытаюсь использовать оператор delete, но он не работает.

tmp TEXT;
FOR tmp IN SELECT names from Garbage
LOOP
    DROP TABLE tmp;
END LOOP; 

но, к сожалению, я получил ошибки в заявлении о падении. Он всегда пытается удалить таблицу "tmp" вместо того, чтобы удалить значение tmp(которые представляют собой некоторые строки, такие как "table1" "table2").

1 ответ

Вам понадобится динамический запрос для выполнения. Для этого вам нужно составить запрос и вызвать EXECUTE:

DECLARE
    tmp TEXT;
    ...
BEGIN
...
FOR tmp IN SELECT names FROM Garbage
LOOP
    EXECUTE 'DROP TABLE ' || quote_ident(tmp);
END LOOP; 
...

Обратите внимание, что я использовал quote_ident Чтобы избежать имени правильно, это лучше и безопаснее. Но, если вы создали таблицу, скажем, с именем MyTable но он не заключал в кавычки (двойные кавычки) во время создания, PostgreSQL также хранит его имя как mytable, так quote_ident('MyTable') будет генерировать "MyTable" который не существует, вы должны позаботиться об этом (например, всегда используйте строчные имена или всегда указывайте свои идентификаторы).

Другие вопросы по тегам