【问题标题】:Better way to assign MAX values to variables?将 MAX 值分配给变量的更好方法?
【发布时间】:2018-05-15 16:00:08
【问题描述】:

我正在尝试将变量(“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;

提前致谢。

【问题讨论】:

  • 取决于您还想对这些结果做什么。你只是想打印它们?您的代码没问题(您可以将其更改为 for 循环)。另一件事:您显示的是计数,而不是与之关联的 hr_utc 值,我认为这会有所帮助。否则,您将看到一些值,但不会看到与哪个组关联。
  • 用 CASE 代替怎么样?

标签: sql oracle plsql


【解决方案1】:

取决于对您来说什么是“更好的方式”。另一种方法是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】:

    有没有更好的方法来做到这一点?

    没错。

    问题是这种情况: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 &gt;= trunc(sysdate) AND date &lt; trunc(sysdate) + interval '1' day

    【讨论】:

    • 我做了一些阅读,这很有意义。非常感谢您指出这一点
    • @John Wick - 阅读聚合函数和隐式游标。聚合函数总是返回一行。上面所有的 cab 都可以在没有 pl/sql 的情况下完成。或者至少只有一个光标。
    • 如果我不想使用函数(因为它可能会导致性能问题),您认为最好的方法是什么?
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2019-02-28
    • 2013-03-05
    相关资源
    最近更新 更多