在 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;
考虑一下:
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;