我在SELECT语句中使用用户定义的函数时遇到了一些有趣的行为。何时在Oracle中的查询中评估用户定义函数?
我有一对存储过程,读取和清除单个表中的数据。这些存储过程由多个来源使用。
以我的观察,看来该用户定义的功能有时评估任意,并不总是立即后或SELECT语句的执行,它是在使用。
例如期间,在存储过程中,我有一个select语句可能看起来像这样:
SELECT Something, MyFunction(Something) FROM Somewhere;
然后调用另一个存储过程,从表中清除数据。清除的数据量由另一个表进行管理,该表存储最大ID读取。这样一来,清除操作不应删除存储过程正在执行的另一个实例尚未读取的任何数据。
在我的测试代码中,MyFunction只是返回表中某处的行数。因此,我会想象它应该总是等于SELECT语句返回的行数。然而,在我运行此存储过程的两个实例的情况下,我得到的结果是这样的:
首先查询实例:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
第二查询实例:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
为什么第二个查询返回所有行,但在同一个表上运行的用户定义函数报告表中没有更多行?
有无论如何,我可以确保第二个查询实例是一致的,因为用户定义的函数仍然可以看到父存储过程正在看到的相同数据?
我不确定明白:在2个电话之间做了y你可以清理桌子吗? – Sebas
对此感到抱歉。为了说明,有一个存储过程(1)执行SELECT语句,并且(2)在SELECT语句之后调用清除过程。 – acee
我明白了,所以函数返回正确的结果不是吗?选择不行,或者说不同的行不应该被返回。确认了吗? – Sebas