Поиск и замена во всех столбцах всех таблиц - PullRequest
0 голосов
/ 17 марта 2020

Я хотел бы найти определенную строку во всех столбцах всех таблиц моей БД и заменить ее другой строкой.

Я не могу понять, как заставить это работать (это просто первая часть):

    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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...