2012-03-09 54 views
1

之后修改TYPE TYPE我想创建一个返回用户定义类型的函数。在创建函数后,我希望能够将类型更新为其他类型,以便函数使用新类型,例如。PostgreSQL:可以使用TYPE创建一个函数并在

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) 

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

编辑:好的事情是我有2个脚本之一是通用的,必须按原样安装,没有变化。它必须安装在多个地方。第二种是一种配置脚本。

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

我想先安装配置脚本,但我不能,因为我需要执行一些基于通用脚本中的函数的插入。

谢谢

回答

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') 

你的配置文件就必须建立外类型+功能或视图。

+0

编辑,但它似乎好像我有一个无尽的循环,我不认为这将是可能的 – 2012-03-09 14:10:29

+0

我想出了一些东西。我只是使用这个安装过程:安装配置脚本,它创建类型,然后在调用另一个脚本,然后完成插入 – 2012-03-12 13:20:33

1

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

同样,CREATE OR REPLACE 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; 

顺便说一句:我个人的建议是始终用户lower case identifiers PostgreSQL中。在这个例子中,我相应地重命名了OUT列。

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 

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

+0

我们使用的是9.0版本,它似乎不起作用,怀疑它们会有任何机会的系统管理员更新它,要感谢 – 2012-03-12 13:16:59

+0

事实上,它不能与PG 9.0一起工作,因为缺少ALTER TYPE中的RENAME ATTRIBUTE子句(根据文档:http://www.postgresql.org/docs/9.0/静态/ SQL-altertype.html) – 2012-03-12 18:17:13

相关问题