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

그러나 결과는 내가 예상했던 것과 다릅니다.

사실 I 이드 열에 될 값 (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' 예외를 잡을 필요가 없습니다. 기본적으로 포스트그레스는 던지지 않습니다. –

답변

12

당신이 그렇지 않으면 당신은 v_pid 변수

select (pid).* into v_pid 
+0

마침내 나는 이것을 몇 시간 동안 찾고 있었다! 고맙습니다. – HLL

+0

감사합니다. .... –