我想将用户定义的类型参数传递给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));
它执行一次分配,而不是尝试单独分配目标字段。