PL/SQL While循环
我是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
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')