簡體   English   中英

如何將用戶定義的類型變量作為參數傳遞給函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM