Я хотел бы найти определенную строку во всех столбцах всех таблиц моей БД и заменить ее другой строкой.
Я не могу понять, как заставить это работать (это просто первая часть):
CREATE TYPE search_columns_result AS
(
schemaname TEXT,
tablename TEXT,
columnname TEXT,
rowctid TEXT
);
CREATE OR REPLACE FUNCTION search_columns(
regex TEXT
)
RETURNS TABLE
(
schemaname TEXT,
tablename TEXT,
columnname TEXT,
rowctid TEXT
)
AS
$$
BEGIN
FOR schemaname,tablename,columnname IN
SELECT c.table_schema, c.table_name, c.column_name
FROM information_schema.columns c
JOIN information_schema.tables t ON
(t.table_name = c.table_name AND t.table_schema = c.table_schema)
WHERE t.table_type = 'BASE TABLE'
LOOP
EXECUTE format('SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L',
schemaname,
tablename,
columnname,
regex
) INTO rowctid;
IF rowctid IS NOT NULL THEN
RETURN NEXT;
END IF;
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) AS (schemaname TEXT,
tablename TEXT,
columnname TEXT,
rowctid TEXT)
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);
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT *
FROM search_and_replace_everywhere('bad data', 'good data');
Я получаю эту ошибку:
[2020-03-17 09:49:42] [42601] ОШИБКА: только список определений столбцов разрешено для функций, возвращающих «запись» [2020-03-17 09:49:42] Где: PL / pg SQL функция search_and_replace_everywhere (текст, текст) строка 5 в строке FOR над SELECT