关于 sql:Postgres 函数通过文本的数据类型更新列

Postgres Function To Update Column By Data Type of Text

我正在尝试在 Postgres 中创建一个函数来查找具有文本数据类型的架构(架构是用户可以传入的文本变量)中的所有列,循环遍历每个返回的记录,然后更新文本列带有特定数据。

这是我的函数示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 语句始终为空。


在条件的两侧制作上边

1
UPPER(table_schema) = UPPER(target_schema)


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

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

我找不到 _new_line_character 定义在哪里。也许你想念它。

我暂时修复它如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    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 请在此处找到更多信息