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

问题描述 投票:1回答:1

考虑此:

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;

我应该如何编写此UPDATE?我找不到在查询中插入变量值以构建变量的方法。

编辑,我想我找到了方式!但是我仍然想念一些东西,因为:

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;

生成:

错误:关系“ public.groups_oxusers”不存在第1行:更新“ public.groups_oxusers” SET组名称= REPLACE(grou ...

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

postgresql dynamic-sql
1个回答
1
投票

您需要两个占位符用于模式和表名,而不是一个。并且应该使用USING子句传递参数:

EXECUTE format('UPDATE %I.%I SET %I = REPLACE(%I, $2, $3)', 
                matching.schemaname, 
                matching.tablename,
                matching.columnname,
                matching.columnname)
  USING regex, replacement;
© www.soinside.com 2019 - 2024. All rights reserved.