2011-08-15 37 views
15

Tôi hiện đang viết một hàm trong postgresql 9,04 nơi tôi đang cố gắng sử dụng một biến sẽ được sử dụng trong câu lệnh chọn rồi trả về kết quả.trả về nhiều cột dưới dạng một cột thay vì nhiều cột

Tuyên bố tôi đã đưa ra là đơn giản và hoạt động; tuy nhiên, tất cả các cột được xuất ra một cột duy nhất thay vì nhiều cột.

đây là chức năng của tôi:

create or replace function foo(IN pID integer, OUT project_id integer, OUT project_name text, OUT project_type text, OUT project_description text, OUT project_status text) 
returns setof record as 

$$ 
select project_id, project_name, project_type, project_description, project_status from  t_projects 
where project_id = $1; 
$$ 

LANGUAGE SQL; 


select foo(6) -- runs function 

sản lượng hiện nay trông như thế này:

"(6,"test project","inbound","inbound test","processing")" 

làm thế nào tôi có thể làm cho nó nên kết quả không được nối với nhau và gửi lại từng hạng mục cột riêng rẽ?

cảm ơn bạn trước.

+1

Tại sao bạn có kiểu trả về 'setof record' trong khi cũng khai báo các cột' OUT' khớp với ' CHỌN'? Bạn có ý định trả về các bản ghi, hoặc điền các tham số 'OUT'? Bạn nên chọn một cách tiếp cận, không phải cả hai. – cdhowie

+0

postgresql vẫn còn mới đối với tôi như tôi đã từng làm việc trong microsoft sql erver. Lý tưởng nhất, tôi muốn trả lại kết quả từ câu lệnh chọn. Trong tìm kiếm google của tôi, tôi thấy rằng mọi người sẽ tạo ra một loại với đầu ra được chỉ định hoặc sẽ đặt đầu ra trong hàm. Hiện tại, tôi vẫn đang trong giai đoạn hiểu biết về postgresql :) – richh

Trả lời

27

bạn cần phải gọi hàm như thế này:

select * from foo(6); 

đó sẽ trở lại một cái gì đó như thế này:

project_id | project_name | project_type | project_description | project_status 
-----------|--------------|--------------|---------------------|---------------- 
     6 | test project |  inbound |  inbound test |  processing 

đó là một điều không minh bạch của postgres rằng nó có thể được gọi là cả hai cách và cung cấp cho bạn một kết quả. bạn có thể muốn kiểm tra các tài liệu trên các hàm trả về được thiết lập một số khác, có nhiều cách khác để thực hiện điều này. Ồ, có một trang wiki trên đó, được viết cho plpgsql, nhưng hầu hết cũng áp dụng cho các hàm sql: http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

+0

Điều đó đã làm nó ... cảm ơn bạn SOOOO nhiều :) – richh

+0

Điều đó thực sự kỳ quặc. – mvexel

+0

Tại sao 'select * from foo (6)' là một lỗi khi định nghĩa foo() với 'create or replace function foo (int) trả về bản ghi setof là $$ SELECT $ 1 as a, 'xx' as b; $$ LANGUAGE SQL; '?? –

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