【问题标题】:PL/SQL Query not fetching limited recordsPL/SQL 查询未获取有限的记录
【发布时间】:2011-05-13 22:52:27
【问题描述】:

我在一个包中有以下查询

l_sql := 'SELECT  table_name.field1,
                  table_name.field2,
                  table_name.field3
            FROM table_name
            WHERE table_name.status = ''ACTIVE'' AND
                  table_name.replication_date >= SYSDATE - :l'

OPEN zequi_cur FOR l_sql USING l_days_between_start;

理想情况下,它应该只选择那些满足条件SYSTDATE-:l 的记录。 l 的值为730492。但它仍在获取所有记录。并且这个表有大约 3000 万条记录,这使得这个查询永远返回。任何想法,它不只获取特定记录的可能原因是什么?

【问题讨论】:

    标签: sql oracle plsql packages


    【解决方案1】:

    除了固定您的日期范围之外,还有什么特别的理由要使用动态 SQL 吗?也许最好使用静态游标:

    declare
      cursor c_cur(b_offset in number) is
        SELECT  table_name.field1,
                table_name.field2,
                table_name.field3
          FROM  table_name
          WHERE table_name.status = ''ACTIVE'' AND
                table_name.replication_date >= SYSDATE - b_offset
      ;
    begin
      open c_cur(l_days_between_start);
      ...
    end;
    

    【讨论】:

      【解决方案2】:

      SYSDATE-730492 给出了公元 10 年的日期,即 2000 年前。我无法想象这就是你的意思?

      如果您的开始日期在 0010 年,您将得到 730492 作为差值:

      SQL> select to_date ('22-NOV-2010 04.50.18 PM','DD-MON-YYYY HH.MI.SS AM')
        2         - to_date ('16-NOV-0010 04.59.22 PM','DD-MON-YYYY HH.MI.SS AM') as diff
        3  from dual;
      
            DIFF
      ----------
      730492.994
      

      【讨论】:

      • l_days_between_start 的值是根据这个表达式计算的。 l_days_between_start := l_now - i_start_date;' the value of l_now = 22-NOV-10 04.50.18 PM` 和 i_start_date = 16-NOV-10 04.59.22 PM 的值。这是给l_days_between_start = 730492.9937037037037037037037037037037037这里有什么问题 ?? :(
      • 我怀疑 l_start_date 的世纪部分(你没有在这里显示)是 00 而不是 20。
      • 您的预期答案在 5 到 6 之间。730492 只是没有通过气味测试!
      • 更新参数表 SET VALUE = to_date('16-NOV-10 17:59:22', 'DD-MON-RR hh24:mi:ss')
      • paramstable 中的VALUE 列是 varchar 类型吗?
      【解决方案3】:

      为了稍微扩展@Tony 的帖子,当您从 DATE 值中减去一个数字时,该数字的计量单位假定为天。因此,减去 730492 天相当于减去大约 2000 年。我怀疑这不是你想做的。

      分享和享受。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多