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