繁体   English   中英

Oracle9i:过滤器表达式无法在运行时排除数据

[英]Oracle9i: Filter Expression Fails to Exclude Data at Runtime

在VB6程序中,我必须维护一个相对简单的select语句。 (抑制您自然发抖的倾向;我继承了这个东西,但没有写。)

该语句很简单(为清楚起见已重新格式化):

select distinct 
   b.ip_address 
from 
   code_table a, 
   location b 
where 
   a.code_item = b.which_id and 
   a.location_type_code = '15' and 
   a.code_status = 'R'

有问题的表从数据库返回IP地址列表。 有问题的关键列是code_status 不久前,我们意识到其中一个IP地址不再有效,因此我们将其状态更改为I (无效)以将其排除在查询结果之外。

当您在SQL Plus或SQL Developer中执行上述查询时,一切都很好。 但是,当您从VB6执行它时,对code_status的检查code_status被忽略,并且无效IP地址将出现在结果集中。

我的第一个猜测是结果被缓存在某个地方。 但是,由于不是Oracle专家,所以我不知道在哪里寻找。

这是古老的 VB6代码。 SQL嵌入在应用程序中。 目前,我没有时间将其重写为存储过程。 (如果有机会,我会有一天。)但是,我需要知道是什么导致这种行为差异以及如何消除这种差异。 如果在这里发生,很可能在其他地方发生。

如果有人可以建议一个不错的地方,我将不胜感激。

一些随机的想法:

  • 确定要提交使ip地址无效的更改吗? 其他人(使用另一个数据库连接/用户)可以看到更改后的code_status吗?

  • 从数据库返回结果后,您确定结果没有被修改吗?

  • 您确定在SQLPlus中使用的代码与数据库(用户,用户等)中的“相同”数据库连接相同吗?

  • 您确定那确实是发送到数据库的SQL吗? (您可以通过在Oracle服务器上进行跟踪或通过调试VB代码进行检查)。 重新格式化可能已更改了“某些内容”。

在我的头上,我想不出任何可能“重新插入”不需要的IP的“缓存”。 希望以上内容能给您一些有关在哪里看的想法。

除了IronGoofy提出的建议外,您是否尝试过围绕最后两个子句交换内容?

where
   a.code_item = b.wich_id and
   a.code_status = 'R' and
   a.location_type_code = '15'

如果得到不同的结果集,则可能表明正在进行某种争执,结果是将狡猾的SQL实际上发送到了数据库。

有一些Oracle错误会导致错误的答案。 这肯定不是那个时候之一。 通常它们涉及视图和函数以及dblink和月相的一些奇怪的组合...

它没有被缓存在任何地方。 Oracle直到11点才缓存结果,即使答案可能更改,Oracle也知道要更改缓存。

我猜这是一个数据问题。 您在查询中的IP地址上有一个DISTINCT,为什么? 如果没有唯一约束,则您的IP地址可能有多个副本,而您只修复了其中一个。

而且您的Code_status与IP地址位于完全不同的表中。 您在代码表中将状态设置为“ I”,然后从“位置”表中获得IP列表。

停止思考斑马,开始思考马。 几乎可以肯定,这只是您不完全了解的数据。

运行这个

select 
   a.location_type_code, 
   a.code_status 
from 
   code_table a, 
   location b 
where 
   a.code_item = b.which_id and 
   b.ip_address = <the one you think you fixed>

我敢打赌,您会看到一行带有“ I”,另一行带有“ R”

我建议您查看V $ SQL系统视图,以确认您认为VB6代码正在运行的查询实际上是它正在运行的查询。

遵循以下原则

select sql_text, fetches
where sql_text like '%ip_address%'

验证SQL_TEXT是否为您期望的值,并且在执行代码时FETCHES计数增加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM