加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:如何返回复合类型

发布时间:2020-12-13 16:33:55 所属栏目:百科 来源:网络整理
导读:我试图在PostreSQL中使用存储函数获取复合值,如下所示. 我创建了一个名为PersonId的类型,我在名为Person的表中使用了该类型. 我在表格中插入了值. CREATE TYPE PersonId AS( id VARCHAR(32),issuer VARCHAR(32));CREATE TABLE Person( key INTEGER,pid Perso
我试图在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_pid变量的第一列中
select (pid).* into v_pid

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读