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"
который не существует, вы должны позаботиться об этом (например, всегда используйте строчные имена или всегда указывайте свои идентификаторы).