【发布时间】: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 会抱怨它发现了意外的 LOCAL 或 TEMPORARY 标记。我不想删除这些标记,因为这样的声明:
drop table res;
将删除默认函数架构中具有该名称的任何表。
非常感谢任何帮助和提示!
【问题讨论】:
-
您找到解决方案了吗?
-
@Alam 我试过
drop table tmp.yourTableName,只要你不在用户定义的函数中这样做,它就可以工作。 -
感谢您的回复,但我确实需要在我的函数\程序中执行此操作,即使文档monetdb.org/Documentation/Manuals/SQLreference/Procedures 说它可能在程序中也不允许它在其中任何一个中执行, 错误说它是“无效的流控制语句”。
-
@Alam,我们面临同样的不便限制
标签: sql function temp-tables monetdb