2017-01-25 12 views
2

私はplpgsqlが関数にユーザー定義型のパラメータを渡したいが、私は、実行時にこのエラーを取得しています:何らかの理由でユーザ定義型変数を関数にパラメータとして渡すにはどうすればよいですか?

dev=# select process_shapes(); 
ERROR: invalid input syntax for integer: "(,,7)" 
CONTEXT: PL/pgSQL function process_shapes() line 9 at SQL statement 
dev=# 

、パラメータが正しく渡されていないと、それはdoesnの理由を私は考えています仕事はありません。

私の機能は以下のとおりです。

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

+0

@ErwinBrandstetter、申し訳ありませんが、私は9.6.1バージョン – Nulik

答えて

4

SELECT ... INTO文のターゲットは、複合型の場合、それは意志SELECTによって返された列のそれぞれをターゲット内の別のフィールドに割り当てます。

しかし、SELECT join_shapes(rectangle,triangle)タイプshape_t単一列を返し、ターゲットの最初の列、すなわちproduced_shape.shape_id(失敗した整数変換についてしたがって、エラーメッセージ)に全体を詰め込むしようとしています。

代わりに、3列を返すSELECTステートメントが必要です。ちょうどあなたが、むしろ個別のターゲットフィールドを割り当てるしようとするよりも、単一代入を行い

produced_shape := (SELECT join_shapes(rectangle,triangle)); 

を使用することができ、また

SELECT * FROM join_shapes(rectangle,triangle) 

SELECT join_shapes(rectangle,triangle) 

を交換してください。

+0

を使用しています。私は入力パラメータに問題があったが、私はshape_tをROW()関数で文字列に変換しようとしていた。ありがとう! – Nulik

関連する問題