我创建了一个创建临时表并插入表中的函数。问题是我需要在只读实例中工作,在只读实例中我不能创建表和/或插入它。有没有其他方法这样做?也许通过以类似于其他SQL语言的方式创建表变量?
我做了一些研究,似乎没有表变量,但可能是一组记录?有什么想法吗?
更新: 为了回答人们的问题,我试图创建一个函数,它以y的间隔返回从现在到x间隔之前的日期列表。因此,例如select * from getDates('3 days',1 day')返回:
startdate | enddate
------------+------------
2016-07-20 | 2016-07-21
2016-07-19 | 2016-07-20
2016-07-18 | 2016-07-19
并从getDates中选择*('3个月','1个月');返回:
startdate | enddate
------------+------------
2016-07-01 | 2016-08-01
2016-06-01 | 2016-07-01
2016-05-01 | 2016-06-01
我目前通过使用while循环并按每个间隔返回直到我达到第一个参数给定的时间来执行此操作。然后我将这些值插入到临时表中,完成后我从表中选择所有内容。如有必要,我可以提供代码。
答案 0 :(得分:0)
将函数声明为retuning table
comprettainsurance.com/*
将其用作:
create function f()
returns table (
a int,
b text
) as $$
select x, y from t;
$$ language sql;
答案 1 :(得分:0)
最好的方法是让管理员GRANT TEMPORARY ON DATABASE database_name TO
执行您的操作的用户帐户。您仍然只能访问数据库。
答案 2 :(得分:0)
您可以创建表示临时表结构的永久named Composite Type,然后使用数组变量来操作函数内的一组行:
-- Define columns outside function
CREATE TYPE t_foo AS
(
id int,
bar text
);
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF t_foo AS
$BODY$
DECLARE
-- Create an empty array of records of the appropriate type
v_foo t_foo[] = ARRAY[]::foo[];
BEGIN
-- Add some rows to the array
v_foo := v_foo || ( 42, 'test' )::t_foo;
v_foo := v_foo || ( -1, 'nothing' )::t_foo;
-- Convert the array to a resultset as though it was a table
RETURN QUERY SELECT * FROM unnest(v_foo);
END;
$BODY$
LANGUAGE plpgsql;
SELECT * FROM test();
这里的关键部分是类型t_foo[]
的变量 - 即预定义类型t_foo
的记录数组。
这不像使用临时表或表变量那么容易,因为您需要使用数组函数来获取和输出数据,但可能很有用。
值得考虑的是,您是否确实需要复杂的本地状态,或者您的问题是否可以重新构建以使用不同的方法,例如:子查询,CTE或a set-returning function with RETURN NEXT
。