2013-07-05 35 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。 ..