我正在学习PostgreSQL,而我正在尝试创建一个函数来改变具有character varying
数据类型列的给定表的数据类型。
为了实现这一点,我构建了一个游标,它基本上查询了information_schema.columns,查找具有类型character varying
的列的表,以便稍后执行alter并尝试将列更改为{{1因此,该字段不受值的长度限制。
这是功能:
text
该函数编译并成功创建,但是在运行该函数后,我注意到alter没有在指定的表名上运行。
你能帮我辨别光标出了什么问题吗?
答案 0 :(得分:1)
您的功能本身没有任何问题;它的功能很好。但有几点:
text
数据类型与character varying
相同,但未指定长度。所以基本上你正在努力改变什么,除非有character varying (n)
列。在information_schema
表中,这两种类型都列为character varying
,因为这是SQL标准; text
类型是PostgreSQL扩展名。CURSOR
,你正在使用循环。这是一件好事,尽可能避免使用游标,因为通常有更有效的方法来做事。format()
函数中,您应该使用占位符而不是字符串连接||
。现在你连接一个字符串,你进一步不格式化。而是使用format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE text', cid.table_schema, cid.table_name, cid.column_name)
。如果您的字符串类型为character (n)
或character varying (n)
,并且您想删除长度限制,那么您应该在同一个表中搜索character_maximum_length IS NOT NULL
的列。