我在函数中使用一个临时表来保存一些结果,但我不知道如何从函数中返回该表。理想情况下,我希望在一个查询中完成所有操作(即不是两个查询:一个用于调用函数,另一个用于从临时表中获取数据)。
目前我的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()
中创建的,所以它不能是它的返回类型。
关于如何实现这一点,有什么想法吗?
感谢
在您的main_function()内部:
RETURN QUERY SELECT * FROM temp_t;
如果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
(...)
另一种方法是定义新的数据类型:
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
(...)
并以与上述相同的方式从函数返回结果。
您确定需要临时表吗?大多数时候,有一个更便宜的解决方案。您的示例可以简单地为:
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;
不要引用语言名称。这是一个标识符。
而不是
创建或替换函数main_FUNCTION()返回空作为
使用类似的创建或替换FUNCTION main_FUNCTION()将表(f1 int,f2 text)返回为…