代码之家  ›  专栏  ›  技术社区  ›  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开发人员中执行上述查询时,一切都很好。但是,当您从vb6执行它时, 代码状态 被忽略,结果集中显示无效的IP地址。

    我的第一个猜测是结果被缓存在某个地方。但是,作为一个甲骨文专家,我不知道到哪里去寻找。

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

    如果有人能推荐一个好地方,我会非常感激的。

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

    一些随机想法:

    • 您确定已提交使IP地址无效的更改吗?其他人(使用其他数据库连接/用户)是否可以看到更改后的代码状态?

    • 确定从数据库返回结果后不修改这些结果吗?

    • 您确定在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'
    

    如果您得到了一组不同的结果,那么这可能意味着某种争论正在进行,从而导致DodgySQL实际上被发送到数据库。

        3
  •  0
  •   Mark Brady    16 年前

    存在导致回答错误的Oracle错误。这肯定不是那种时候。通常它们涉及到一些奇异的视图和功能组合,以及dblink和月球相位…

    它不在任何地方缓存。Oracle直到11点才缓存结果,甚至在答案可能更改时,它也知道要更改缓存。

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

    您的代码状态与您的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%'
    

    验证SQL_文本是您期望的文本,并且在执行代码时提取计数会增加。