Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:如何返回复合类型_Postgresql_Composite - Fatal编程技术网

PostgreSQL:如何返回复合类型

PostgreSQL:如何返回复合类型,postgresql,composite,Postgresql,Composite,我试图在PostreSQL中使用存储函数获得一个复合值,如下所示。 我创建了一个名为PersonId的类型,并在名为Person的表中使用了该类型 我在表中插入了值 CREATE TYPE PersonId AS ( id VARCHAR(32), issuer VARCHAR(32) ); CREATE TABLE Person ( key INTEGER, pid PersonId ); INSERT INTO Person V

我试图在PostreSQL中使用存储函数获得一个复合值,如下所示。 我创建了一个名为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)

我错在哪里了?

因为
pid
是一个组合,所以必须提取它的列,否则将把整个组合插入
v\u pid
变量的第一列

select (pid).* into v_pid

旁注-您不需要捕获
no\u data\u found
异常。默认情况下,postgres不会抛出它。