У меня есть триггерная функция вставки, в которой NEW.schema_name ссылается на схему. Я хочу динамически копировать таблицы, найденные внутри этой схемы ('foobaz', 'barbaz'), как 'foo' и 'bar'. Затем я могу выполнять запросы без динамического sql.
Как я могу создать функцию или просто скопировать / вставить один и тот же блок кода для достижения этой цели.
РЕДАКТИРОВАТЬ:
Я не могу заставить этот динамический запрос работать.
Часть внутри оператора WITH работает.
Не нижняя часть «выполнить». Я не знаю, является ли это синтаксической проблемой, или плохим приведением, или какими-либо ограничениями в pgsql, которые делают его не работающим.
WITH info_schema_subset_table as (SELECT table_schema, table_name,
array_to_string((regexp_split_to_array(table_name,'_'))[4:array_length(regexp_split_to_array(table_name,'_'),1)-1] as new_table
FROM information_schema.tables
where table_schema = "schema_searched"
ORDER BY new_table ASC)
EXECUTE 'CREATE TABLE $2 as (SELECT * FROM $1)'
USING info_schema_subset_table.table_schema || '.' ||info_schema_subset_table.table_name,info_schema_subset_table.new_table;
РЕДАКТИРОВАТЬ 2
... Сломанный код удален ...
В приведенном ниже коде, в котором я не уверен, правильный ли синтаксис, я получаю следующее от триггера
Ошибки провайдера:
Ошибка PostGIS при добавлении функций: ERREUR: l'opérateur n'existe pas: запись ~~ неизвестна
ЛИНИЯ 1: ВЫБРАТЬ old_table LIKE "% ens%"
^
ПОДСКАЗКА: Aucun opérateur не соответствует типу аргументов.
Vous devez ajouter des преобразований объясняет тип.
QUERY: ВЫБЕРИТЕ old_table LIKE "% ens%"
КОНТЕКСТ: функция PL / pgsql validation_sio.afi_validation_sio (), строка 18 à CASE
РЕДАКТИРОВАТЬ 3:
CREATE OR REPLACE FUNCTION foo.foo()
RETURNS TRIGGER AS
$BODY$
DECLARE
old_table record;
new_table record;
dynamic_query text;
BEGIN
IF TG_OP = 'INSERT'
THEN
FOR old_table IN SELECT table_schema|| '.' ||table_name
FROM information_schema.tables
where table_schema = NEW.nom_schema
LOOP
CASE
WHEN
old_table LIKE '%ens%' THEN
new_table := concat('SIT_',array_to_string((regexp_split_to_array(info_schema.old_table,'_'))[4:array_length(regexp_split_to_array(info_schema.old_table,'_'),1)-1],'_'));
ELSE
new_table := concat('SID_',array_to_string((regexp_split_to_array(info_schema.old_table,'_'))[4:array_length(regexp_split_to_array(info_schema.old_table,'_'),1)-1],'_'));
END CASE;
dynamic_query := format('SELECT * FROM' || old_table ||);
EXECUTE dynamic_query
INTO new_table;
END LOOP;
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE TRIGGER foo
AFTER INSERT ON validation.validationfoo
FOR EACH ROW EXECUTE PROCEDURE foo.foo();