2013-07-05 76 views
3

我在函數中使用臨時表來保存一些結果,但是我不知道如何從函數返回表。理想情況下,我想在一個查詢中執行所有操作(即不是兩個查詢:一個用於調用該函數,另一個用於從臨時表中獲取數據)。如何在postgresql函數中返回臨時表結果

目前我main_function()如下:

CREATE OR REPLACE FUNCTION main_function() RETURNS void AS 
$BODY$ 
BEGIN 

    DROP TABLE IF EXISTS temp_t CASCADE; 
    CREATE TEMP TABLE temp_t AS SELECT * FROM tbl_t limit 0; 

    EXECUTE 'INSERT INTO temp_t ' || 'SELECT * FROM tbl_t limit 10'; 

END; 
$BODY$ 
LANGUAGE 'plpgsql' ; 

我打電話來它像這樣:同樣

SELECT * from main_function(); 
SELECT * from temp_t; 

,問題是,我不竟要撥打的第二個查詢。第一個查詢應該返回臨時表作爲結果,但是我不能這樣做,因爲臨時表在main_function()中創建,因此它不能是它的返回類型。

有關如何實現此目的的任何想法?

感謝

回答

4

裏面你main_function():

RETURN QUERY SELECT * FROM temp_t; 

...如果temp_t表由例如COLUMN1(整型),列2(布爾)和欄3(VARCHAR(100)),你也應該定義返回類型爲:

CREATE OR REPLACE FUNCTION main_function(column1 OUT integer, column2 OUT boolean, column3 OUT varchar(100)) RETURNS SETOF record AS 
(...) 

的另一種方法是定義新的數據類型:

CREATE TYPE temp_t_type AS (
    column1 integer, 
    column2 boolean, 
    column3 varchar(100) 
); 

以同樣的方式如上所述

CREATE OR REPLACE FUNCTION main_function() RETURNS SETOF temp_t_type AS 
(...) 

...並返回結果從功能:該類型可以通過你的函數以同樣的方式返回正常的數據類型。

+0

謝謝你,我明白了。 –

3

您確定您需要臨時表嗎?大多數時候,有一個更便宜的解決方案。你舉的例子可以簡單地:

CREATE OR REPLACE FUNCTION main_function() 
    RETURNS SETOF tbl_t AS 
$BODY$ 
BEGIN 

RETURN QUERY EXECUTE 'SELECT * FROM tbl_t LIMIT 10'; 

END 
$BODY$ 
LANGUAGE plpgsql; 

你也不需要EXECUTE甚至PLPGSQL的簡單情況:

CREATE OR REPLACE FUNCTION main_function() 
    RETURNS SETOF tbl_t AS 
$BODY$ 

SELECT * FROM tbl_t LIMIT 10; 

$BODY$ 
LANGUAGE sql; 

就堅決不引語言名稱。這是一個標識符。

0

代替

CREATE OR REPLACE FUNCTION main_function()返回void AS

使用一些像 CREATE OR REPLACE FUNCTION main_function()返回表(F1 INT,F2文本)AS。 ..