Использование переменных в ОБНОВЛЕНИИ (отредактировано) - PullRequest
1 голос
/ 17 марта 2020

Подумайте об этом:

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 ...

Почему вокруг имени таблицы есть двойные кавычки, а не имя столбца и как его удалить?

1 Ответ

1 голос
/ 17 марта 2020

Вам нужны два заполнителя для схемы и имени таблицы, а не один. И параметры должны быть переданы с предложением USING:

EXECUTE format('UPDATE %I.%I SET %I = REPLACE(%I, $2, $3)', 
                matching.schemaname, 
                matching.tablename,
                matching.columnname,
                matching.columnname)
  USING regex, replacement;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...