Postgres函数按文本数据类型更新列

时间:2018-03-27 02:07:52

标签: sql postgresql

我正在尝试在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。

2 个答案:

答案 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_identquote_literal,请查看更多信息here

答案 1 :(得分:0)

在条件两侧上面

UPPER(table_schema) = UPPER(target_schema)