Postgres:函数中的临时表是持久的。为什么?

aar*_*ona 1 sql postgresql temp-tables sql-function postgresql-9.3

我的 postgresql 数据库中有以下功能:

CREATE OR REPLACE FUNCTION get_unused_part_ids()
  RETURNS integer[] AS
$BODY$
DECLARE
  part_ids integer ARRAY;
BEGIN
  create temporary table tmp_parts
      as
  select vendor_id, part_number, max(price) as max_price
    from refinery_akouo_parts
   where retired = false
   group by vendor_id, part_number
  having min(price) < max(price);

  -- do some work etc etc

  -- simulate ids being returned
  part_ids = '{1,2,3,4}';
  return part_ids;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION get_unused_part_ids()
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

这会编译,但是当我运行时:

select get_unused_part_ids();
Run Code Online (Sandbox Code Playgroud)

临时表tmp_parts仍然存在。之后我可以做一个选择。请原谅我,因为我已经习惯了 t-sql/MSSQL 的特定功能。MSSQL 不会出现这种情况。我究竟做错了什么?

Jon*_*anG 5

该表只会在会话结束时被删除。您需要指定要删除的 ON COMMIT 选项,它将在事务结束时删除表。

  create temporary table tmp_parts 
  on commit drop
      as
  select vendor_id, part_number, max(price) as max_price
    from refinery_akouo_parts
   where retired = false
   group by vendor_id, part_number
  having min(price) < max(price);
Run Code Online (Sandbox Code Playgroud)