您好我想创建一个返回用户定义类型的函数。创建函数后,我希望能够将类型更新为其他类型,以便函数使用新类型,例如。
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)
这可能吗?更改将始终只是列的名称而不是实际数据格式,它将始终相同。
编辑:嗯,问题是我有两个脚本,一个是通用的,必须按原样安装,不做任何更改。它必须安装在多个地方。第二种是配置脚本。
在通用脚本中,我创建了一个函数,该函数返回我想在配置脚本中定义的类型。
我想先安装配置脚本,但我不能根据通用脚本中的函数执行一些插件。
由于
答案 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
列。