当前位置:  开发笔记 > 数据库 > 正文

如何将用户定义的类型变量作为参数传递给函数?

如何解决《如何将用户定义的类型变量作为参数传递给函数?》经验,为你挑选了1个好方法。

我想将用户定义的类型参数传递给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



1> Nick Barnes..:

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));

它执行一次分配,而不是尝试单独分配目标字段。

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有