【问题标题】:Drop a local temporary table within a function in MonetDB在 MonetDB 的函数中删除本地临时表
【发布时间】:2017-03-20 22:42:24
【问题描述】:

考虑以下场景。我有一堆用户定义的函数f_i,它们创建、填充和使用同名的本地临时表res

create function f_i()
returns table( … )
begin
       # Result stats table.
       create local temporary table res(
             param1 int,
             param2 int
       );

       /* Populate res */
       /* Use res in some queries */

       return table(
             /* Query involving res */
       );
end;

我的第一个问题是:Does create local temporary table x 创建一个表,在声明它的函数完成执行后立即释放/删除它?我认为是这种情况,但我现在对此表示怀疑,因为我们遇到了各种并发问题,这些问题表明 res 表没有从内存中正确清除。

这将我带到第二个问题:如果临时表存在,我该如何删除?这样做的原因是为了防止table create 异常(我们目前正在遇到)。我想实现以下方面的目标:

create function f_i()
returns table( … )
begin
       # Drop local temporary table if such table exists.
       drop local temporary table res;         <-------- How do I do this in MonetDB?

       # Result stats table.
       create local temporary table res(
             param1 int,
             param2 int
       );

       /* Populate res */
       /* Use res in some queries */

       return table(
             /* Query involving res */
       );
end;

如您所见,我想显式删除本地临时表res(如果存在)。如果我在 drop 语句中留下 local temporary 标记,MonetDB 会抱怨它发现了意外的 LOCALTEMPORARY 标记。我不想删除这些标记,因为这样的声明:

drop table res;

将删除默认函数架构中具有该名称的任何表。

非常感谢任何帮助和提示!

【问题讨论】:

  • 您找到解决方案了吗?
  • @Alam 我试过drop table tmp.yourTableName,只要你不在用户定义的函数中这样做,它就可以工作。
  • 感谢您的回复,但我确实需要在我的函数\程序中执行此操作,即使文档monetdb.org/Documentation/Manuals/SQLreference/Procedures 说它可能在程序中也不允许它在其中任何一个中执行, 错误说它是“无效的流控制语句”。
  • @Alam,我们面临同样的不便限制

标签: sql function temp-tables monetdb


【解决方案1】:

尝试关注?

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL   DROP TABLE #Temp;

【讨论】:

  • 不幸的是,MonetDB 没有像 OBJECT_ID 这样的函数。也没有关于在哪里可以找到在用户定义的函数中创建的本地临时表的信息。如果我可以知道有关本地临时表的信息存储在哪里,我可以查询该表并使用 if 的同源词来删除它。我的问题仍然存在:是否可以删除本地临时表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多