我在我的项目中使用PostgreSQL,我有一个Spring应用程序,它使用Flyway来创建我的数据库上的所有内容。我需要创建一个列,它的类型是基于另一个表上的一行。例如:
ALTER TABLE NAMES ADD COLUMN (SELECT n.name FROM NAMES AS n WHERE n.name = 'Tom') VARCHAR(255) NULL;这个是可能的吗?我可以创建一个函数来完成选择工作,然后在Alter代码中调用它吗?
上下文:如果您想知道我为什么需要这个,我有很多客户端使用几何学类型,而且每个客户端都有不同的EPSG,我需要基于客户机的几何学创建"geom“列,所以我想根据我的客户端的名称进行选择,得到它的几何学类型,然后创建带有该类型的列。
编辑:
我想我找到了我需要的东西:
CREATE OR REPLACE FUNCTION client_schema.update_geom(my_table text, my_schema text, OUT alter_result boolean)
LANGUAGE plpgsql
AS $function$
declare client_projection varchar(255);
declare db_name varchar(255);
begin
CREATE extension if not EXISTS dblink;
select split_part(current_database(), '-', 1) into db_name;
select c.projection_key from client_schema.dblink('dbname=adm-3','SELECT projection_key, context_name FROM "adm-3".public.clients as c ')
AS c(projection_key text, context_name text) where c.context_name = db_name into client_projection;
EXECUTE 'ALTER TABLE '
|| esquema::text || '.' || tabela::text
|| ' ALTER COLUMN geom type geometry(Polygon, split_part($1, '':'', 2))'
INTO alter_result
USING client_projection;
END;
$function$
;现在的问题是他不让我更新列的类型!错误:SQL Error [42601]: ERROR: type modifiers must be simple constants or identifiers
发布于 2021-04-01 19:59:37
用以下功能解决了我的问题:
CREATE OR REPLACE FUNCTION client_schema.update_geometry_type(my_table text, my_schema text, OUT update_result boolean)
LANGUAGE plpgsql
AS $function$
declare new_projection varchar(255);
declare my_database varchar(255);
declare old_projection varchar(255);
begin
CREATE extension if not EXISTS dblink;
select split_part(current_database(), '-', 1) into my_database;
select c.projection_key from client_schema.dblink('dbname=adm-3','SELECT projection_key, client_name FROM "adm-3".public.client as c ')
AS c(projection_key text, client_name text) where c.client_name = my_database into new_projection;
select Find_SRID(my_schema, my_table, 'geom') into old_projection ;
select split_part(new_projection , ':', 2) into new_projection;
EXECUTE 'ALTER TABLE '
|| my_schema::text || '.' || my_table::text
|| ' ALTER COLUMN geom type geometry(Polygon, ' || new_projection ||') USING ST_Transform(geom, ''EPSG:' || old_projection || ''', ' || new_projection || ')';
END;
$function$
;发布于 2021-04-01 21:37:26
您可以使用生成create table语句的SQL。它能产生插入物什么的。这样,您就可以在不同的DB系统之间移动数据,等等。
https://dba.stackexchange.com/questions/289105
复制相似问题