2
我正在学习PostgreSQL,并且我正在尝试创建一个函数来ALTER具有character varying
数据类型的列的给定表的数据类型。更改文本为字符变化不按预期执行
要做到这一点,我已经建立了一个光标,基本上查询INFORMATION_SCHEMA.COLUMNS寻找具有与character varying
类型列后执行ALTER,并尝试改变列text
表,让现场不限由价值的长度。
下面是函数:
CREATE OR REPLACE FUNCTION my_cursor(db_name TEXT, tbl_schema TEXT, tbl_name TEXT, col_type TEXT) RETURNS void AS $func$
DECLARE
cid record;
BEGIN
FOR cid IN SELECT * FROM information_schema.columns AS ic
WHERE ic.table_catalog=db_name
AND ic.table_schema=tbl_schema
AND ic.table_name=tbl_name
AND ic.data_type=col_type
LOOP
EXECUTE format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE text', cid.table_schema, cid.table_name, cid.column_name);
END LOOP;
RETURN;
END;
$func$ LANGUAGE plpgsql;
SELECT my_cursor('database10232016', 'public', 'continent', 'character varying');
功能编译和创建成功后,运行该功能后,但我注意到圣坛是不是在指定的表名来运行。
你能帮我找出我的光标出了什么问题吗?
嗨帕特里克, 感谢您采取突出这些要点。然而,独立于数据类型的建议,我仍然在努力看到ALTER TABLE打算做的改变。您可以请针对具有不同类型字符的列的本地表尝试相同的功能。 结果应该是字符变化列应该变成文本类型columna。 – fndg87
我的观点是'text'数据类型永远不会显示一列。这只是一个方便的符号'字符变化'。你想要的是去除长度限制,这应该与你的函数一起工作,但你最好检查'character_maximum_length'而不是列数据类型。 – Patrick
我明白你的观点。现在让我们说我在表格中有smallint类型的列,我想将它们更改为bigint。考虑写入的功能来改变和尝试它,它不会工作。 (例如: 例如: SELECT my_cursor('database10232016','public','continent','smallint'); 而Alter部分应该看起来像这样: format('ALTER TABLE%I.%I ALTER COLUMN%I TYPE bigint',cid.table_schema,cid.table_name,cid。column_name) 这就是我想指出的。由于某些原因,它没有运行alter函数。 – fndg87