[英]how do I pass a user defined type variable to a function as a parameter?
我想将用户定义的类型参数传递给 PLPGSQL 函数,但在运行时出现此错误:
dev=# select process_shapes();
ERROR: invalid input syntax for integer: "(,,7)"
CONTEXT: PL/pgSQL function process_shapes() line 9 at SQL statement
dev=#
出于某种原因,参数没有正确传递,我不知道为什么它不起作用。
我的职能是:
CREATE OR REPLACE FUNCTION join_shapes(first_shape shape_t,second_shape shape_t,OUT new_shape shape_t)
AS $$
DECLARE
BEGIN -- simplified join_shape()s function
new_shape.num_lines:=first_shape.num_lines+second_shape.num_lines;
END;
$$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION process_shapes()
RETURNS void AS $$
DECLARE
rectangle shape_t;
triangle shape_t;
produced_shape shape_t;
BEGIN
rectangle.num_lines:=4;
triangle.num_lines:=3;
SELECT join_shapes(rectangle,triangle) INTO produced_shape;
RAISE NOTICE 'produced shape = %s',produced_shape;
END;
$$ LANGUAGE PLPGSQL;
类型定义:
CREATE TYPE shape_t AS (
shape_id integer,
shape_name varchar,
num_lines integer
);
Postgres 版本:9.6.1
当SELECT ... INTO
语句的目标是复合类型时,它将把SELECT
返回的每一列分配给目标中的不同字段。
但是, SELECT join_shapes(rectangle,triangle)
返回shape_t
类型的单个列,并且它试图将整个内容塞入目标的第一列,即produced_shape.shape_id
(因此有关整数转换失败的错误消息)。
相反,您需要一个返回三列的SELECT
语句。 只需更换
SELECT join_shapes(rectangle,triangle)
和
SELECT * FROM join_shapes(rectangle,triangle)
或者,您可以使用
produced_shape := (SELECT join_shapes(rectangle,triangle));
它执行单个分配,而不是尝试单独分配目标字段。
对于想要将复合类型传递给函数的其他人:
create type pref_public.create_test_row_input as (
name text
);
create or replace function pref_public.create_test_row(test_row pref_public.create_test_row_input) returns pref_public.test_rows as $$
insert into pref_public.test_rows (name)
values
(test_row.name)
returning *;
$$ language sql strict security definer;
grant execute on function pref_public.create_test_row to pref_user;
您需要使用row()
select * from pref_public.create_test_row(row('new row'));
更多信息在这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.