Postgresql中的非易失性函数不允许使用CREATE TABLE AS

时间:2018-09-30 13:58:01

标签: postgresql postgresql-10

我已经在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;

在创建方法没有问题之后,当我调用我的方法时: select * from 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

我认为我无法在方法中创建表格?对吧?

1 个答案:

答案 0 :(得分:1)

该函数不能为IMMUTABLE,请将其定义为VOLATILE

the documentation:

  

任何具有副作用 的函数都被标记为VOLATILE,因此无法对其进行优化。

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


更新。

使用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
  ...