【问题标题】:Postgres Function To Update Column By Data Type of TextPostgres函数通过文本的数据类型更新列
【发布时间】:2018-03-27 13:51:59
【问题描述】:

我正在尝试在 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 语句始终为空。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我认为这里的问题是您的查询中的UPPER(table_schema) = target_schema

    函数中的另一个位置是REPLACE(r.column_name,。如果我没记错的话,这在您的文本字符串中。所以当你执行它时,数据库会找到表r的列名column_name,当然它不存在。

    我找不到_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

    【讨论】:

    • 谢谢。这有帮助。我忘了添加上部(target_schema)。欣赏它。
    【解决方案2】:

    在条件的两侧制作鞋面

    UPPER(table_schema) = UPPER(target_schema) 
    

    【讨论】:

    • 谢谢。这有帮助。我忘了添加上部(target_schema)。欣赏它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多