PostgreSQL:如何返回复合类型

7

我想通过PostgreSQL中的存储函数获取一个复合值,如下所示。

我创建了一个名为PersonId的类型,并在名为Person的表中使用了该类型。

然后,我向表中插入了值。

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$;

然而,结果与我预期的不同。

实际上,我预期的是111这个值会在id列中出现,ABC会在issuer列中出现。但是,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)

我错在哪里了?

附注 - 您不需要捕获“no_data_found”异常。默认情况下,Postgres不会抛出它。 - Ihor Romanchenko
1个回答

14

由于 pid 是一个复合类型,您必须提取它的列,否则您会将整个复合类型插入到 v_pid 变量的第一列中。

select (pid).* into v_pid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接