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

时间:2017-01-25 03:41:40

标签: postgresql plpgsql

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

2 个答案:

答案 0 :(得分:4)

SELECT ... INTO语句的目标是复合类型时,它会将SELECT返回的每个列分配给目标中的其他字段。

但是,SELECT join_shapes(rectangle,triangle)会返回类型为shape_t列,并且它会尝试将整个内容填充到目标的第一列,即{{1} (因此有关失败的整数转换的错误消息)。

相反,您需要一个返回三列的produced_shape.shape_id语句。只需替换

SELECT

SELECT join_shapes(rectangle,triangle)

或者,您可以使用

SELECT * FROM join_shapes(rectangle,triangle)

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

答案 1 :(得分:0)

对于其他想要将复合类型传递给函数的人:

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

更多信息here