将文本更改为不按预期执行的字符

时间:2016-11-12 22:11:41

标签: sql postgresql cursor postgresql-9.4 sql-function

我正在学习PostgreSQL,而我正在尝试创建一个函数来改变具有character varying数据类型列的给定表的数据类型。

为了实现这一点,我构建了一个游标,它基本上查询了information_schema.columns,查找具有类型character varying的列的表,以便稍后执行alter并尝试将列更改为{{1因此,该字段不受值的长度限制。

这是功能:

text

该函数编译并成功创建,但是在运行该函数后,我注意到alter没有在指定的表名上运行。

你能帮我辨别光标出​​了什么问题吗?

1 个答案:

答案 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的列。