Подумайте об этом:
CREATE OR REPLACE FUNCTION search_and_replace_everywhere(regex TEXT,
replacement TEXT)
RETURNS VOID AS
$$
DECLARE
matching search_columns_result;
BEGIN
FOR matching IN SELECT *
FROM search_columns(regex)
LOOP
RAISE NOTICE 'schemaname: %s, tablename: %s, columnname: %s, rowctid: %s', quote_ident(matching.schemaname), quote_ident(matching.tablename), quote_ident(matching.columnname), quote_ident(matching.rowctid);
UPDATE ${matching.schemaname}.${matching.tablename} SET ${matching.columnname} = REPLACE(${matching.columnname}, regex, replacement);
END LOOP;
END;
$$ LANGUAGE plpgsql;
Как мне написать это ОБНОВЛЕНИЕ? Я не могу найти способ вставить значение переменной в запрос для его построения.
РЕДАКТИРОВАТЬ, я думаю, что я нашел способ! Но я все еще что-то упускаю, потому что:
CREATE OR REPLACE FUNCTION search_and_replace_everywhere(regex TEXT,
replacement TEXT)
RETURNS VOID AS
$$
DECLARE
matching search_columns_result;
BEGIN
FOR matching IN SELECT *
FROM search_columns(regex)
LOOP
RAISE NOTICE 'schemaname: %s, tablename: %s, columnname: %s, rowctid: %s', QUOTE_IDENT(matching.schemaname), QUOTE_IDENT(matching.tablename), QUOTE_IDENT(matching.columnname), QUOTE_IDENT(matching.rowctid);
EXECUTE format('UPDATE %I SET %I = REPLACE(%I, %I, %I)', matching.schemaname || '.' || matching.tablename,
matching.columnname, matching.columnname, regex, replacement);
END LOOP;
END ;
$$ LANGUAGE plpgsql;
генерирует:
ОШИБКА: отношение "publi c .groups_oxusers" не существует ЛИНИЯ 1: ОБНОВЛЕНИЕ "publi c .groups_oxusers "SET group_name = REPLACE (grou ...
Почему вокруг имени таблицы есть двойные кавычки, а не имя столбца и как его удалить?