2013-08-06 32 views
19

我有這個PL/pgSQL函數,它必須返回一些用戶的信息。PL/pgSQL函數:如何用執行語句返回表

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; 

我現在面臨的問題是,該函數的結果是一個列的表是這樣的:

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

雖然我預計:

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

我認爲(但不知道)問題來自EXECUTE聲明,但我看不到如何做。

任何想法?

+4

你是用'SELECT my_function(123);'還是'SELECT FROM my_function(123)'調用函數? –

+0

你是完全正確的,我用SELECT my_function(123)執行函數;它完美地與FROM ...一起工作,謝謝! – Getz

回答

24

你是如何執行該功能的?它用作選擇語句。

創建一個表:public.users

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

插入一些記錄:

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

功能:創建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; 

現在你可以使用*

select * from my_function(1); 

查詢的結果

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

或者與列名以及

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

結果

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

的確,我用SELECT my_function(123)調用了我的函數。謝謝。 – Getz

+0

有沒有什麼辦法解決這個問題 - >查詢返回*而不是特定的列名/類型 – Thirumal

2

調用函數那樣:

select * from my_function(123); 

不只是選擇。我做了,它的工作原理