如何在postgresql函数中返回临时表结果

Sho*_*jaz 3 sql postgresql types

我在函数中使用临时表来保存一些结果,但我不知道如何从函数返回表.理想情况下,我想在一个查询中执行所有操作(即不是两个查询:一个用于调用函数,另一个用于从临时表中获取数据).

目前我的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' ;
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

SELECT * from main_function();
SELECT * from temp_t;
Run Code Online (Sandbox Code Playgroud)

同样,问题是我实际上并不想调用第二个查询.第一个查询应该返回临时表作为结果,但是我不能这样做,因为临时表是在创建的,main_function()所以它不能是它的返回类型.

关于如何实现这一点的任何想法?

谢谢

cat*_*lhu 5

在你的main_function()里面:

RETURN QUERY SELECT * FROM temp_t;
Run Code Online (Sandbox Code Playgroud)

...如果temp_t表由例如column1(类型整数),column2(布尔值)和column3(varchar(100))组成,则还应将返回的类型定义为:

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

另一种方法是定义新的数据类型:

CREATE TYPE temp_t_type AS (
    column1 integer,
    column2 boolean,
    column3 varchar(100)
);
Run Code Online (Sandbox Code Playgroud)

您可以使用与普通数据类型相同的方式返回该类型:

CREATE OR REPLACE FUNCTION main_function() RETURNS SETOF temp_t_type AS
(...)
Run Code Online (Sandbox Code Playgroud)

...并以与上述相同的方式从函数返回结果.


Erw*_*ter 5

您确定需要临时表吗?大多数时候,有更便宜的解决方案。你的例子可以简单地是:

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;
Run Code Online (Sandbox Code Playgroud)

对于简单的情况,您也不需要EXECUTE甚至不需要 plpgsql:

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

SELECT * FROM tbl_t LIMIT 10;

$BODY$
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

切勿引用语言名称。这是一个标识符。