gpt4 book ai didi

postgresql - CREATE TABLE AS 不允许在 Postgresql 的非 volatile 函数中使用

转载 作者:行者123 更新时间:2023-11-29 12:40:34 25 4
gpt4 key购买 nike

我在 postgresql 10 上写过这个方法:

create or replace function get_users()
returns TABLE(user_idd uuid, device_idd text, shapee text , datee timestamp) AS
$$
begin
create temp table lines as
SELECT DISTINCT user_id, device_id from olocations;
select uuid_generate_v4(),
o1.user_id,
o1.device_id,
st_astext(ST_Collect(o1.shape)),
date(o1.creation_date_time) as date
from olocations o1
inner join lines on o1. device_id = lines.device_id and o1.user_id = lines.user_id
where o1.user_id = 'd0edfc59-9923-44c3-9c34-ef5aad3cb810'
and o1.device_id = '89984320001811791540'
group by o1.user_id, o1.device_id, date
order by date ASC ;
DROP TABLE lines;
end
$$
LANGUAGE 'plpgsql'
IMMUTABLE
SECURITY DEFINER
COST 100;

创建方法后没有任何问题,当我调用我的方法时:从 get_users() 中选择 *;我收到此错误:

sql> select  from get_users()
[2018-09-30 17:23:23] [0A000] ERROR: CREATE TABLE AS is not allowed in a non-volatile function
[2018-09-30 17:23:23] Where: SQL statement "create temp table lines as
[2018-09-30 17:23:23] SELECT DISTINCT user_id, device_id from olocations"
[2018-09-30 17:23:23] PL/pgSQL function get_users() line 3 at SQL statement

我想我不能在方法中创建表?对吧?

最佳答案

函数不能是IMMUTABLE,定义为VOLATILE

根据 the documentation:

Any function with side-effects must be labeled VOLATILE, so that calls to it cannot be optimized away.

在这种情况下,这种副作用是表创建。


更新。

使用return query 返回查询生成的行:

  ...
return query
select uuid_generate_v4(),
o1.user_id,
o1.device_id,
st_astext(ST_Collect(o1.shape)),
date(o1.creation_date_time) as date
...

关于postgresql - CREATE TABLE AS 不允许在 Postgresql 的非 volatile 函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52578533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com