2013-08-06 24 views
19

Tôi có hàm PL/pgSQL này phải trả về một số thông tin người dùng.Các hàm PL/pgSQL: Cách trả về bảng với câu lệnh thực thi

CREATE OR REPLACE FUNCTION my_function(user_id integer) 
    RETURNS TABLE(id integer, firstname character varying 
          , lastname character varying) AS 
$$ 
DECLARE 
    ids character varying; 
BEGIN 
    ids := ''; 

    --Some code which build the ids string, not interesting for this issue 

    RETURN QUERY EXECUTE 'SELECT users.id, users.firstname, users.lastname 
    FROM public.users WHERE ids IN (' || ids || ')'; 
END; 
$$ LANGUAGE plpgsql; 

Vấn đề tôi đang phải đối mặt là kết quả của hàm là một cột bảng duy nhất như thế này:

╔═══╦═════════════════════╗ 
║ ║my_function   ║ 
╠═══╬═════════════════════╣ 
║ 1 ║ (106,Ned,STARK)  ║ 
║ 2 ║ (130,Rob,STARK)  ║ 
╚═══╩═════════════════════╝ 

Trong khi tôi mong đợi:

╔═══╦════════════╦════════════╦═════════════╗ 
║ ║ id   ║ firstname ║ lastname ║ 
╠═══╬════════════╬════════════╬═════════════╣ 
║ 1 ║ 106  ║ Ned  ║ STARK  ║ 
║ 2 ║ 103  ║ Rob  ║ STARK  ║ 
╚═══╩════════════╩════════════╩═════════════╝ 

Tôi nghĩ (nhưng không chắc chắn) vấn đề xuất phát từ tuyên bố EXECUTE, nhưng tôi không thể xem cách thực hiện khác.

Bất kỳ ý tưởng nào?

+4

Bạn đang gọi hàm với 'SELECT my_function (123);' hoặc 'SELECT FROM my_function (123);'? –

+0

Bạn hoàn toàn đúng, tôi đã thực hiện chức năng với SELECT my_function (123); nó hoạt động hoàn hảo với TỪ ... Cảm ơn bạn! – Getz

Trả lời

24

Bạn đang thực hiện chức năng đó như thế nào? Nó hoạt động như một câu lệnh chọn.

Tạo một bảng: public.users

create table public.users (id int, firstname varchar, lastname varchar); 

Chèn một số hồ sơ:

insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd'); 

chức năng: my_function

CREATE OR REPLACE FUNCTION my_function(user_id integer) RETURNS TABLE(id integer, firstname character varying, lastname character varying) AS $$ 
    DECLARE 
     ids INTEGER[]; 
    BEGIN 
     ids := ARRAY[1,2]; 
     RETURN QUERY 
      SELECT users.id, users.firstname, users.lastname 
      FROM public.users 
      WHERE users.id = ANY(ids); 
    END; 
$$ LANGUAGE plpgsql; 

Bây giờ bạn có thể sử dụng với *

select * from my_function(1); 

Kết quả truy vấn

id | firstname | lastname 
----+-----------+---------- 
    1 | aaa  | bbb 
    2 | ccc  | ddd 

Hoặc với tên cột cũng

select id,firstname,lastname from my_function(1); 

quả

id | firstname | lastname 
----+-----------+---------- 
    1 | aaa  | bbb 
    2 | ccc  | ddd 
+1

Thật vậy, tôi gọi hàm của tôi bằng SELECT my_function (123). Cảm ơn. – Getz

+0

Có cách nào để giải quyết điều này -> truy vấn trả về * thay vì tên/loại cột cụ thể – Thirumal

2

Gọi chức năng như thế:

select * from my_function(123); 

Không chỉ với lựa chọn. Tôi đã làm và nó hoạt động

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