我正在尝试在Postgres中创建一个函数来查找模式中的所有列(模式是用户可以传入的文本变量),文本数据类型,遍历每个返回的记录,然后更新文本列具体数据。
以下是我的函数示例代码:
CREATE OR REPLACE FUNCTION update_text_columns_newline(target_schema text)
RETURNS void
AS $$
DECLARE
r information_schema.columns%ROWTYPE;
sql text := ' ';
BEGIN
FOR r IN
select table_schema, table_name, column_name
from information_schema.columns
where upper(data_type) = 'TEXT'
and UPPER(table_schema) = target_schema
LOOP
_sql = _sql + ' UPDATE ' || r.table_schema || '.' || r.table_name || ' SET ' || r.column_name || ' = REPLACE(r.column_name, _new_line_character, CHR(10));';
END LOOP;
EXECUTE _sql;
END;
$$ LANGUAGE plpgsql;
循环似乎没有返回查询中的值,而我的_sql语句始终为null。
答案 0 :(得分:0)
我认为您的查询中的问题是UPPER(table_schema) = target_schema
。
您函数中的另一个位置是REPLACE(r.column_name,
。如果我没有错,这就在你的文本字符串中。因此,当您执行它时,数据库将找到表column_name
的列名r
,当然它不存在。
我无法找到_new_line_character
定义的位置。也许你想念它。
我暂时将其修复为
CREATE OR REPLACE FUNCTION update_text_columns_newline(target_schema text)
RETURNS void
AS $$
DECLARE
r information_schema.columns%ROWTYPE;
_sql text := ' ';
_new_line_character varchar;
BEGIN
FOR r IN
select table_schema, table_name, column_name
from information_schema.columns
where upper(data_type) = 'TEXT'
and UPPER(table_schema) = upper(target_schema)
LOOP
_sql = _sql + ' UPDATE ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' SET ' || quote_ident(r.column_name) || ' = REPLACE(' || quote_ident(r.column_name) || ', ' || quote_literal(_new_line_character) || ', CHR(10));';
END LOOP;
EXECUTE _sql;
END;
$$ LANGUAGE plpgsql;
关于quote_ident
和quote_literal
,请查看更多信息here
答案 1 :(得分:0)
在条件两侧上面
UPPER(table_schema) = UPPER(target_schema)