PL/SQL While循环

PL/SQL While循环,sql,oracle,plsql,Sql,Oracle,Plsql,我是PL/SQL的初学者。我想运行简单的WHILE循环,但我收到了错误 这是我的密码: 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 H

我是PL/SQL的初学者。我想运行简单的WHILE循环,但我收到了错误

这是我的密码:

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;
声明
计数器整数:=01;
开始
而计数器=截止日期('2016年9月14日12.00.00上午','DD-MON-YY HH.MI.SS上午')
插入日期=60
按计数排序(iid)说明;
端环;
结束;
我在运行代码时遇到以下错误:

*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;
*从命令中的第1行开始出现错误-
声明
计数器整数:=01;
开始
而计数器=截止日期('2016年9月14日12.00.00上午','DD-MON-YY HH.MI.SS上午')
插入日期=60
按计数排序(iid)说明;
端环;
结束;
错误报告-ORA-06550:第9行第49列:
PL/SQL:ORA-00907:缺少右括号
ORA-06550:第6行第5列:
PL/SQL:SQL语句被忽略
655000000-“行%s,列%s:\n%s”
原因:通常是PL/SQL编译错误。
行动:


有什么问题吗?提前谢谢

将计数器转换为字符后,您可能希望使用CONCAT或| |,以便将其添加到这些字符串之间

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

如注释中所述,要回答您的问题,您需要使用
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')

不要连接,如果您只需将计数器添加到适当的日期值,则效率会更高(而且在我看来更容易阅读)。您也没有增加计数器,并且在查询中缺少了
分组依据
。最后,查询结果必须存储在某个地方

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;
/
声明
计数器整数:=1;
l_自_日期起;
l_name varchar(200);
l_计数整数;
开始
自日期:=至日期('2016年9月14日上午12.00.00','DD-MON-YY上午8:00.00');

而计数器可以直接连接字符串

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')
插入日期>=截止日期('2016年9月14日12.00.00上午','DD-MON-YY HH.MI.SS上午')

插入的日期?你能重新格式化你的问题,使其缩进显示为固定文本吗?段落形式很难阅读。
到目前为止('2016年9月14日12.+counter+'.00 PM','DD-MON-YY HH.MI.SS AM')
等等,我会编辑它。谢谢artm-这也会起作用吗。。。到目前为止('2016年9月14日12.| |到|字符(计数器)| |+'.00 PM','DD-MON-YY HH.MI.SS AM'),我从未在第一行以上初始化oracle中的变量。但是,我不知道为什么要这样做。Oracle从很多版本开始就支持隐式转换。Oracle一直支持隐式转换,所有主流SQL供应商都支持隐式转换。这就是为什么我明确提到
(可能也是以前的版本,但我从未处理过这些版本)
。谢谢你的确认。很好的建议,但是2016-09-14的日期要少得多。@WilliamRobertson:我知道,而且我自己也更喜欢ANSI文字-我只是不想再介绍另一个“新”东西(看到OP显然是新来者)对不起,但是插入了日期。@archimede:不知道。但在这种情况下,我更喜欢使用
l_from_date+interval'1'minute*计数器
(明确意图)
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')