2013-08-13 2 views
6

私は、PostreSQLで以下のようにストアド関数を使って合成値を取得しようとしています。 私はPersonIdという型を作成しました。私はPersonという表の型を使用しました。PostgreSQL:複合型を返す方法

テーブルに値を挿入しました。

CREATE TYPE PersonId AS 
(
    id  VARCHAR(32), 
    issuer VARCHAR(32) 
); 

CREATE TABLE Person 
(
    key  INTEGER, 
    pid  PersonId 
); 

INSERT INTO Person VALUES (1, ('111','ABC')); 
INSERT INTO Person VALUES (2, ('222','DEF')); 

CREATE OR REPLACE FUNCTION Person_lookup_id 
(
    p_key IN Person.key%TYPE 
) 
RETURNS Person.pid%TYPE 
LANGUAGE plpgsql 
AS $BODY$ 
DECLARE 
    v_pid Person.pid%TYPE; 
BEGIN 
    SELECT pid INTO v_pid 
    FROM Person 
    WHERE key = p_key; 

    RETURN v_pid; 

EXCEPTION 
    WHEN no_data_found THEN 
     RETURN NULL; 
END; 
$BODY$; 

しかし、結果は私が予想していたものとは異なっていました。

実際に私は、id列に値111が、発行者列にABCがあることを期待していました。しかし、111とABCはidカラムに結合されました。

# select person_lookup_id(1); 
person_lookup_id 
------------------ 
("(111,ABC)",) 
(1 row) 

# select * from person_lookup_id(1); 
    id  | issuer 
-----------+-------- 
(111,ABC) | 
(1 row) 

私は間違っていましたか? pid以来

+0

サイドノートの最初の列に、全複合材を挿入しているその列を抽出する必要があり、複合です - あなたは 'no_data_found'例外をキャッチする必要はありません。デフォルトでは、postgresはスローしません。 –

答えて

12

は、あなたがそうでなければ、あなたがv_pid変数

select (pid).* into v_pid 
+0

最後に私はこの時間を探していました!ありがとうございました。 – HLL

+0

感謝します! .... –

関連する問題