我即将学习postgresql,我遇到了某种问题。我希望通过存储过程(函数)将大部分连接从网站连接到数据库。到目前为止,我有大约20个函数,其中5个函数返回与列完全相同的表,即:
create or replace function my_Function( t text )
returns setof table(uid uuid,testText text, randomInt int ...)
...
因为表(uid uuid,testText文本,randomInt int ...)重复了5次,我发现我可以使用复合类型从我的函数返回相同类型的数据,所以如果我需要返回一个额外的我可以改变我的复合类型和瞧,所有5个函数都应该返回相同的列。
不幸的是,这不是那么有用,只要我在我的复合类型中添加了一个新列,所有使用我的复合类型的函数都会出现saem错误:
Final statement returns too few columns
这是有道理的,因为我不选择额外的列来适应复合类型。
有没有办法告诉哪些函数使用复合类型作为返回类型? 有没有办法强制复合类型填充新创建的列的空白(如果没有,那么我也可以使用表(...)返回类型,因为它不解决我试图避免的冗余问题)?
答案 0 :(得分:2)
示例设置:
create type my_type as (id int, name text);
create or replace function my_function_1()
returns setof my_type language plpgsql as $$
declare
rec my_type;
begin
rec.id := 1;
rec.name := 'name';
return next rec;
end $$;
create or replace function my_function_2()
returns setof my_type language plpgsql as $$
begin
return query select 1::int, 'name'::text;
end $$;
有没有办法告诉哪些函数使用复合类型作为返回类型?
是:
select nspname as schema_name, proname as function_name
from pg_proc p
join pg_namespace n on n.oid = pronamespace
join pg_type t on t.oid = prorettype
where typname = 'my_type';
schema_name | function_name
-------------+---------------
public | my_function_1
public | my_function_2
(2 rows)
有没有办法强制复合类型为新创建的列填充空白?
没有。在向类型添加新属性后,您可以尝试重新创建(不进行修改)函数:
alter type my_type add attribute new_col int;
create or replace function my_function_1() ...
create or replace function my_function_2() ...
但只有返回该类型的下一个变量的函数才能正常工作(my_function_1()
将起作用,my_function_2()
赢了。
答案 1 :(得分:0)
使用Postgres复合类型可以获得哪些优势?这似乎是一个痛苦的世界。我可以探讨一下这对QueryFirst的作用吗?您的程序将在您的应用程序中的.sql文件中,使用您的应用程序进行版本控制,源代码控制。对于共享返回类型的5个过程,您将创建一个C#接口。在5个Results.cs文件的每一个中,在结果分部类上继承接口。因此,5个过程可以单独进化,根据需要添加列。如果您修改了proc以使其不再满足接口:编译错误。一个更宽容,更容忍的场景。
免责声明:我写过QueryFirst