PostgreSQL. Обратиться к таблице не зная ее имени напрямую
Есть таблица TABLE1, в колонке которой хранятся названия других таблиц. Есть ли возможность в postgreSQL получить содержимое этих самых таблиц не обращаясь к ним напрямую вбивая название руками, а выдергивая их из TABLE1?
В нете не смог найти ничего подобного. Заранее спасибо)
Чуть подробнее: TABLE1 содержит сотни записей. Каждая запись имеет имя таблицы, к которой она относится. Таблиц гораздо меньше и их имена мы получаем при помощи запроса:
SELECT DISTINCT TABLENAME FROM TABLE1;
В результате получаем таблицу, в каждой строчке которой лежит имя таблицы. После этого, мне нужно создать таблицу, которая бы в 1-ом столбце писала имя таблицы из TABLE1, а во 2-ом количество записей в этой таблице.
Ответы (1 шт):
Можно генерировать произвольный запрос в текстовом виде и получать содержимое любой таблицы. Вопрос только, какой запрос в итоге должен получиться. Динамический запрос можно выполнить так:
Есть такие операторы: - PREPARE, EXECUTE и execute из PL/pgSQL.
-- Собираешь произвольный запрос в текстовой форме
-- Добавляешь к нему 'PREPARE my_plan AS ', где my_plan - имя запроса
-- Запускаешь подготовленную команду через процедурный execute
-- В конце, запускаешь EXECUTE с указанным ранее именем запроса
DO $$
DECLARE _sql varchar;
BEGIN -- Тут опиши свой запрос
_sql = COALESCE((SELECT string_agg(DISTINCT
'SELECT
'||quote_literal(TABLENAME)||' AS name
, (SELECT count(*) FROM '||quote_ident(TABLENAME)||') AS countt'
,' UNION ')
FROM TABLE1
),'SELECT '||quote_literal('Нет данных')||' AS name, 0 AS countt');
_sql = 'PREPARE my_plan AS ' || _sql;
BEGIN
execute _sql;
EXCEPTION
WHEN DUPLICATE_PREPARED_STATEMENT THEN
_sql='DEALLOCATE my_plan; '||_sql;
execute _sql;
END;
END $$;
EXECUTE my_plan;
Код DO $$ ... END $$ можно обернуть в хранимую процедуру, в которую передавать сгенерированный запрос в виде параметра и вызывать его для каждой таблицы из TABLE1.