代码之家  ›  专栏  ›  技术社区  ›  Mike Hofer

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

  •  0
  • Mike Hofer  · 技术社区  · 16 年前

    在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执行它时 代码状态 被忽略,无效的IP地址出现在结果集中。

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

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

    如果有人能推荐一个好地方看看,我将不胜感激。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Thorsten    16 年前

    一些随机想法:

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

    • 您确定从数据库返回结果后不会对其进行修改吗?

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

    • 您确定这确实是发送到数据库的SQL吗?(您可以通过在Oracle服务器上跟踪或调试VB代码进行检查)。改革可能改变了“一些东西”。

    我脑子里想不出任何可能“重新插入”不需要的ip的“缓存”。希望上面的内容能给你一些关于在哪里看的想法。

        2
  •  0
  •   Carl    16 年前

    除了IronGoofy提出的建议外,你是否尝试过对最后两个条款进行交换?

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

    如果你得到一组不同的结果,那么这可能表明正在进行某种争论,导致可疑的SQL实际上被发送到数据库。

        3
  •  0
  •   Mark Brady    16 年前

    Oracle的错误会导致错误的答案。这肯定不是那种时候。通常,它们涉及视图和功能、数据库链接和月相的奇怪组合。..

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

    我想这是一个数据问题。查询中的IP地址有差异,为什么?如果没有唯一约束,您的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”的

        4
  •  0
  •   Gary Myers    16 年前

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

    有些东西沿着线

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

    验证Async TEXT是否是您期望的值,以及执行代码时FETCHES计数是否会增加。