0

我有一个表import.hugo(导入是模式),我需要将所有列数据类型从更改textnumeric. 该表已经有数据,所以要改变列(例如)y我使用这个:

ALTER TABLE import.hugo ALTER COLUMN y TYPE numeric USING (y::numeric); 

但是该表有很多列,我不想手动进行。我在这里找到了一些东西并像这样尝试:

do $$
declare
t record;
begin
    for t IN select column_name, table_name
            from information_schema.columns
            where table_name='hugo' AND data_type='text'         
    loop
        execute 'alter table ' || t.table_name || ' alter column ' || t.column_name || ' type numeric';
    end loop;
end$$;

当我运行它时,它不起作用,它说:relation "hugo" does not exist 我尝试了这个代码的更多变体,但我无法让它工作。我也不知道,如何实现这部分:(USING (y::numeric);从第一个命令开始)到这个命令中。

理想情况下,我需要它在一个函数中,用户可以在其中定义一个表的名称,我们在其中更改列数据类型。所以函数像这样调用SELECT function_name(table_name_to_alter_columns);

谢谢。

4

1 回答 1

0

选择table_namefrominformation_schema.columns是不够的,因为import架构不在您的search path. 您可以通过附加到中显示的任何内容来将import架构添加到您的架构中,或者您可以将列添加到您的块中:search_pathimportSHOW search_pathtable_schemaDO

do $$
declare
t record;
begin
    for t IN select column_name, table_schema || '.' || table_name as full_name
            from information_schema.columns
            where table_name='hugo' AND data_type='text'         
    loop
        execute 'alter table ' || t.full || ' alter column ' || t.column_name || ' type numeric USING (' || t.column_name || '::numeric)';
    end loop;
end$$;
于 2021-03-18T18:10:35.913 回答