2015-03-13 145 views
0

有没有办法销毁一个PL/SQL对象,比如说一个记录?销毁Oracle PLSQL对象

在visual pascal中,我们可以使用FreeAndNil(object),并且此过程释放对象使用的内存并将其指向Nil(null),从而销毁该对象。

我想知道是否有办法在PLSQL对象/记录上做这件事,或者我应该给它分配null。

+7

当变量超出范围时,内存将被释放。除非你正在做非常不寻常的事情,否则记录(或任何一组局部变量)将消耗的内存量非常微不足道,而且这些变量在相当短的时间内存在于内存中,所以它通常不会意识到担心内存消耗。你是否在做一些让你关心本地变量所使用的内存的事情? – 2015-03-13 14:19:07

+0

是的。我们创建了一些实现业务规则的包。这些软件包进行计算并将记录作为参数传递。在调试过程中,我们遇到了第一遍没有返回值的情况。然后,在第二阶段,我们得到了正常的回报。在调查问题的同时,我们发现该记录充满了来自使用相同包的客户端应用程序的另一种方法的数据。这就是为什么我要求一种安全清除记录的方式,以便我们不会混淆数据。这种行为出乎意料。 – 2015-03-15 16:53:15

+3

这是一个非常*不同于你问的问题。在一个会话中创建的PL/SQL对象不可能在另一个会话中可见。如果您构建了一个三层应用程序,其中中间层维护一个连接池,并且您已构建了维护状态的包,则您应该清除包状态,作为关闭逻辑连接并将其返回到池的一部分。如果你的软件包不是有状态的,我会保证你的代码有错误。 – 2015-03-15 19:52:30

回答

2

你可以设置行类型为null,没问题。

编译没有问题:

declare 
    r dual%rowtype; 
begin 
    r := null; 
end; 

如果一个变量失去范围(所以end;这里后),Oracle会自动销毁,所以没有必要将其设置为null,或以任何方式释放它。

+2

我不认为这回答OP的问题(据我了解 - 这可以归结为*是否需要或应该将其设置为NULL)。 – 2015-03-13 14:18:47

+0

@FrankSchmitt:我明白你的观点。现在好多了?添加了最后一行解释。 – 2015-03-13 14:21:26

+0

织补。这使我的答案过时 - 删除它:-) – 2015-03-13 14:22:43

0

问题是该软件包有一个全局变量(在该软件包的规范中声明的一个变量)。

客户端应用程序启动了一个事务,该事务从该包中执行了一个函数;这个函数改变了全局变量值。然后,调用另一个依赖于变量值的函数。这导致了这个问题。

结论很明显:不要使用全局变量。

当然,还有其他的解决方案,比如关闭交易(因此摧毁像Patrick Hofman解释的变量)。

就像我说过的,这是传统的软件......我重构了代码,这个问题(以及其他一些问题)消失了。谢谢您的帮助!