2013-08-13 41 views
6

Tôi đang cố gắng để có được một giá trị tổng hợp với một hàm được lưu trữ trong PostreSQL như sau. Tôi đã tạo một loại có tên là PersonId và tôi đã sử dụng loại trong bảng có tên là Person.PostgreSQL: cách trả về kiểu hỗn hợp

Và tôi đã chèn các giá trị vào bảng.

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

Tuy nhiên, kết quả khác với những gì tôi đã mong đợi.

Thực ra tôi dự kiến ​​giá trị 111 sẽ ở cột id và ABC trong cột tổ chức phát hành. Nhưng 111 và ABC được kết hợp trong cột 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) 

Tôi đã sai ở đâu?

+0

Side note - bạn không cần phải bắt 'ngoại lệ no_data_found'. Theo postgres mặc định sẽ không ném nó. –

Trả lời

12

Kể từ pid là một hỗn hợp bạn phải giải nén cột của nó nếu không bạn đang chèn toàn bộ hỗn hợp vào cột đầu tiên của v_pid biến

select (pid).* into v_pid 
+0

Cuối cùng tôi đã tìm kiếm điều này CHO GIỜ! Cảm ơn bạn. – HLL

+0

CẢM ƠN BẠN! .... –

Các vấn đề liên quan