设置 return table 数据类型与另一个 table 数据类型相同
Setting return table data type be the same type as another table
我有一个 postgres table 函数当前声明为:
CREATE OR REPLACE FUNCTION apolloqa.my_func(arguments...)
RETURNS TABLE(first_name text, last_name text, age int)
LANGUAGE plpgsql AS $function$
BEGIN
RETURN QUERY
select first_name, last_name, age
from person_table ;
END
$function$ ;
当我 运行 这段代码时,postgres 抱怨 first_name 和 return table 中的 last_name 与查询的 return 类型。那是真实的。但是我如何声明 first_name 和 last_name 以便它匹配查询的 return 类型或基础 person_table 的列类型而不重复相同的类型?有没有办法这样说:
RETURNS TABLE(first_name TYPE is person_table.first_name, ... )
?
Postgres 具有 'like' 功能,但它 select 包含给定 table 的所有列。我想 select 一个 table 中的一些,另一个 table 中的一些。我过去的解决方案是从底层 table 对数据类型进行硬编码,例如 varchar(150) 等。但是,如果可能的话,我想让类型引用另一种类型。
您可以使用复制类型
By using %TYPE you don't need to know the data type of the structure
you are referencing, and most importantly, if the data type of the
referenced item changes in the future (for instance: you change the
type of user_id from integer to real), you might not need to change
your function definition.
https://www.postgresql.org/docs/current/plpgsql-declarations.html#PLPGSQL-DECLARATION-TYPE
您的函数 INPUT 和 OUTPUT 参数名称与查询主体列名称相同。这可能会导致将来出现一些错误。参见DB fiddle:最后一个代码块
CREATE OR REPLACE FUNCTION apolloqa.my_func(p_age person_table.age%type)
RETURNS TABLE(_first_name person_table.first_name%type,
_last_name person_table.last_name%type,
_age person_table.age%type)
LANGUAGE plpgsql AS $function$
BEGIN
RETURN QUERY
select first_name, last_name, age from person_table where age = p_age;
END
$function$;
是的,您几乎可以完全按照您的指示进行操作,只是语法略有不同。使用
returns table(first_name person_table.first_name%type
,last_name person_table.last_name%type
,age int
);
由于您的函数只有 SQL,您还可以将其定义为 SQL 函数:
create or replace function my_func(arguments text)
returns table(first_name person_table.first_name%type
,last_name person_table.last_name%type
,age int
)
language sql as $function$
select first_name, last_name, age
from person_table ;
$function$ ;
我有一个 postgres table 函数当前声明为:
CREATE OR REPLACE FUNCTION apolloqa.my_func(arguments...)
RETURNS TABLE(first_name text, last_name text, age int)
LANGUAGE plpgsql AS $function$
BEGIN
RETURN QUERY
select first_name, last_name, age
from person_table ;
END
$function$ ;
当我 运行 这段代码时,postgres 抱怨 first_name 和 return table 中的 last_name 与查询的 return 类型。那是真实的。但是我如何声明 first_name 和 last_name 以便它匹配查询的 return 类型或基础 person_table 的列类型而不重复相同的类型?有没有办法这样说:
RETURNS TABLE(first_name TYPE is person_table.first_name, ... )
?
Postgres 具有 'like' 功能,但它 select 包含给定 table 的所有列。我想 select 一个 table 中的一些,另一个 table 中的一些。我过去的解决方案是从底层 table 对数据类型进行硬编码,例如 varchar(150) 等。但是,如果可能的话,我想让类型引用另一种类型。
您可以使用复制类型
By using %TYPE you don't need to know the data type of the structure you are referencing, and most importantly, if the data type of the referenced item changes in the future (for instance: you change the type of user_id from integer to real), you might not need to change your function definition.
https://www.postgresql.org/docs/current/plpgsql-declarations.html#PLPGSQL-DECLARATION-TYPE
您的函数 INPUT 和 OUTPUT 参数名称与查询主体列名称相同。这可能会导致将来出现一些错误。参见DB fiddle:最后一个代码块
CREATE OR REPLACE FUNCTION apolloqa.my_func(p_age person_table.age%type)
RETURNS TABLE(_first_name person_table.first_name%type,
_last_name person_table.last_name%type,
_age person_table.age%type)
LANGUAGE plpgsql AS $function$
BEGIN
RETURN QUERY
select first_name, last_name, age from person_table where age = p_age;
END
$function$;
是的,您几乎可以完全按照您的指示进行操作,只是语法略有不同。使用
returns table(first_name person_table.first_name%type
,last_name person_table.last_name%type
,age int
);
由于您的函数只有 SQL,您还可以将其定义为 SQL 函数:
create or replace function my_func(arguments text)
returns table(first_name person_table.first_name%type
,last_name person_table.last_name%type
,age int
)
language sql as $function$
select first_name, last_name, age
from person_table ;
$function$ ;