繁体   English   中英

PL/SQL While 循环

[英]PL/SQL While Loop

我是 PL/SQL 的初学者。 我想运行简单的 WHILE LOOP 并且我收到错误。

这是我的代码:

DECLARE
  counter INTEGER := 01;
BEGIN
  WHILE counter <= 30 
  LOOP
    SELECT name, count(iid) as Counts
    FROM table.orders
    WHERE date_inserted >= TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM')
    AND date_inserted <= TO_DATE('14-SEP-16 12.'counter'.00 PM','DD-MON-YY HH.MI.SS AM')
    HAVING count(iid) >= 60
    ORDER BY count(iid) DESC;
  END LOOP;
END;

运行代码时出现以下错误:

*Error starting at line : 1 in command -
DECLARE
  counter INTEGER := 01;
BEGIN
  WHILE counter <= 30 
  LOOP
    SELECT iname, count(iid) as Counts
    FROM table.orders
    WHERE date_inserted >= TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM')
    AND date_inserted <= TO_DATE('14-SEP-16 12.'counter'.00 PM','DD-MON-YY HH.MI.SS AM')
    HAVING count(iid) >= 60
    ORDER BY count(iid) DESC;
  END LOOP;
END;

错误报告 - ORA-06550:第 9 行,第 49 列:
PL/SQL: ORA-00907: 缺少右括号
ORA-06550:第 6 行,第 5 列:
PL/SQL:忽略 SQL 语句
06550. 00000 - “第 %s 行,第 %s 列:\\n%s”
原因:通常是 PL/SQL 编译错误。
行动:

似乎是什么问题? 提前致谢!

不要连接,如果您只是将计数器添加到正确的日期值,它会更有效(在我看来更容易阅读)。 您也不会增加计数器,并且您在查询中缺少group by 最后,查询的结果必须存储在某个地方。

DECLARE
  counter INTEGER := 1;
  l_from_date DATE;
  l_name varchar(200);
  l_count integer;
BEGIN
  from_date := TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM');

  WHILE counter <= 30 
  LOOP
    SELECT name, count(iid) as Counts
       into l_name, l_count --<< store the result somewhere
    FROM table.orders 
    WHERE date_inserted >= l_from_date 
    AND date_inserted <= l_from_date + counter
    GROUP BY name --<< this was missing as well
    HAVING count(iid) >= 60
    ORDER BY count(iid) DESC;

    counter := counter + 1;  --<< increment the counter

    -- do something with l_name and l_count ....
  END LOOP;
END;
/

与此问题无关:但您应该避免日期值的 NLS 特定格式字符串。 最好使用不依赖于运行代码的 SQL 客户端(或应用程序)使用的语言的格式。 例如to_date('2016-09-14 00:00:00', 'yyyy-mm-dd hh24:mi:ss')

您可能想要使用 CONCAT 或 || 在将 counter 转换为 char 以将其添加到这些字符串之间之后。

在您的代码中,我没有看到您增加了计数器。 是设计的吗??

要回答您的问题,如评论中所述,您需要使用concat来连接字符串。 将您的 where 条件更改为

WHERE date_inserted >= TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM')
AND date_inserted <= TO_DATE('14-SEP-16 12.'||to_char(counter)||'.00 PM','DD-MON-YY HH.MI.SS AM')

事实上,在 Oracle 11 或更新版本中(也可能是以前的,但我从未研究过这些版本),您不需要明确进行转换。 所以你可以直接将counter连接到字符串。

WHERE date_inserted >= TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM')
AND date_inserted <= TO_DATE('14-SEP-16 12.'||counter||'.00 PM','DD-MON-YY HH.MI.SS AM')

您可以直接连接字符串

WHERE date_inserted >= TO_DATE('14-SEP-16 12.00.00 AM','DD-MON-YY HH.MI.SS AM')
AND date_inserted <= TO_DATE('14-SEP-16 12.'||counter||'.00 PM','DD-MON-YY HH.MI.SS AM')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM