在 UPDATE 中使用变量(已编辑)

Usage of variables in an UPDATE (edited)

考虑一下:

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;

生成:

ERROR: relation "public.groups_oxusers" does not exist LINE 1: UPDATE "public.groups_oxusers" SET group_name = REPLACE(grou...

为什么 table 名称周围有双引号而不是列名周围有双引号以及如何删除它?

架构和表名需要两个占位符,而不是一个。参数应使用 USING 子句传递:

EXECUTE format('UPDATE %I.%I SET %I = REPLACE(%I, , )', 
                matching.schemaname, 
                matching.tablename,
                matching.columnname,
                matching.columnname)
  USING regex, replacement;