考虑此:
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 ...
为什么表名周围有双引号而不是列名周围以及如何删除它?
您需要两个占位符用于模式和表名,而不是一个。并且应该使用USING
子句传递参数:
EXECUTE format('UPDATE %I.%I SET %I = REPLACE(%I, $2, $3)',
matching.schemaname,
matching.tablename,
matching.columnname,
matching.columnname)
USING regex, replacement;