PostgreSQL:可以用TYPE创建一个函数,然后修改TYPE

时间:2012-03-09 13:40:14

标签: sql postgresql plpgsql

您好我想创建一个返回用户定义类型的函数。创建函数后,我希望能够将类型更新为其他类型,以便函数使用新类型,例如。

CREATE TYPE my_type AS ("Column1" text, "Column2" text);

CREATE OR REPLACE FUNCTION my_fucntion()
RETURNS SETOF my_type
bla
bla
blah

ALTER TYPE my_type AS ("Name" text, "Address" text)

这可能吗?更改将始终只是列的名称而不是实际数据格式,它将始终相同。

编辑:嗯,问题是我有两个脚本,一个是通用的,必须按原样安装,不做任何更改。它必须安装在多个地方。第二种是配置脚本。

在通用脚本中,我创建了一个函数,该函数返回我想在配置脚本中定义的类型。

我想先安装配置脚本,但我不能根据通用脚本中的函数执行一些插件。

由于

3 个答案:

答案 0 :(得分:2)

我尝试使用PostgreSQL 9.1,它似乎正常工作。 例如:

CREATE TYPE my_type as (col1 text, col2 text);
CREATE TABLE my_table (a my_type);
INSERT INTO my_table values(('ab','cd'));
CREATE FUNCTION my_function() returns setof my_type as 
    'begin return query select (a).* from my_table; end;'
language plpgsql;

select * from my_function();

输出是:

 col1 | col2 
------+------
 ab   | cd

现在让我们重命名my_type中的列:

alter type my_type rename attribute col1 to address;
alter type my_type rename attribute col2 to name;

=>没有错误

现在再次调用函数:

select * from my_function();

没有错误,输出是:

 address | name 
---------+------
 ab      | cd

看起来像预期的结果,不是吗?

答案 1 :(得分:1)

无法看到如何让它发挥作用。当你改变它的定义时,取决于“my_type”的任何东西都会破坏。

也许会针对您要解决的实际问题发布另一个问题。

编辑(问题澄清后):好的 - 所以你想要为特定的客户或网站或其他类似的重命名列。将原始函数包装在视图中:

CREATE VIEW local_columns AS
SELECT column1 AS foo, column2 as bar FROM my_function()

如果需要传递参数,请将函数包装在另一种类型和函数中:

SELECT * FROM my_outer_function('some','params')

您的配置文件必须设置外部类型+功能或视图。

答案 2 :(得分:1)

这在PostgreSQL中通常是不可能的。我引用了CREATE FUNCTION上的手册:

  

此外,创建或替换功能将不允许您更改返回   输入现有函数。为此,您必须删除并重新创建   功能。 (使用OUT参数时,表示无法更改   除掉函数之外的任何OUT参数的类型。)

大胆强调我的。为了简化流程(并删除类型和功能之间的联系),您可以考虑使用OUT parameters or RETURNS TABLE而不是RETURNS SETOF my_type。像这样:

CREATE OR REPLACE FUNCTION my_function()
 RETURNS TABLE (column1 text, column2 text) AS
$BODY$
 -- do something
$BODY$ language xyz;

暂且不说:我的个人建议是始终在PostgreSQL中使用lower case identifiers。我在示例中相应地重命名了OUT列。