代码之家  ›  专栏  ›  技术社区  ›  John Wick

为变量指定最大值的更好方法?

  •  0
  • John Wick  · 技术社区  · 7 年前

    我试图将一个变量(“COUNT”)定义为查询的计数,以便稍后在PLSQL块的条件语句中使用它。我使用以下语法获取计数:

    Select count(value_tx) from value where trunc(date) = trunc(sysdate)
    

    目前我知道的唯一方法是使用光标。有没有更好的方法?我使用光标的方法如下:

    Create or Replace Procedure TEST IS
    CURSOR C1 is
    select count(value_tx) as COUNTE
      from value
      where trunc(date) = trunc(sysdate)
      group by hr_utc;
    l_var c1%ROWTYPE;
    BEGIN
    Open c1;
            FETCH c1 into l_var;
            IF l_var.counte > 0 THEN  DBMS_OUTPUT.PUT_LINE(l_var.COUNTE);
            END IF;
    Close c1;
    END TEST;
    

    提前谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   sticky bit    7 年前

    这取决于对你来说什么是“更好的方式”。另一种选择是 FOR loop with an implicit cursor over a SELECT

    FOR R IN (SELECT COUNT(VALUE_TX) AS COUNTE
                     FROM VALUE
                     WHERE TRUNC(DATE) = TRUNC(SYSDATE)
                     GROUP BY HR_UTC) LOOP
      IF R.COUNTE > 0 THEN
        DBMS_OUTPUT.PUT_LINE(R.COUNTE);
      END IF;
    END LOOP;
    

    这是一个方便的语法捷径,如果你在这里把它算作“更好”的话。

        2
  •  1
  •   krokodilko    7 年前

    有没有更好的方法?

    当然是的。

    问题是这种情况: where trunc(date) = .... 。这将阻止RDBMS在上使用索引 date 柱如果表太大,可能会导致性能问题。我不打算解释原因,您可以在其他地方找到解释,例如: Why do functions on columns prevent the use of indexes?

    您需要将此条件替换为:

     `where date >= trunc(sysdate) AND date < trunc(sysdate) + 1
    

    where date >= trunc(sysdate) AND date < trunc(sysdate) + interval '1' day