我在pl / sql中编写非常简单的块代码:
DECLARE
dateof21 DATE;
dzien number;
dzien_tyg number;
BEGIN
dateof21:= '2001-01-01';
WHILE dateof21 != '2101-01-01' LOOP
SELECT EXTRACT(day from date dateof21) INTO dzien from dual;
select to_char(date dateof21,'D') INTO dzien_tyg from dual;
if ((dzien=13) AND (dzien_tyg=5)) THEN
dbms_output.put_line(to_char(dateof21));
end if;
dateof21:= dateof21+1;
END LOOP;
END;
但是我得到了非常烦人的错误:
ORA-06550:linia 8,kolumna 26:
PL / SQL:ORA-00936:brakwyrażenia
ORA-06550:linia 8,kolumna 2:
PL / SQL:忽略SQL语句
ORA-06550:linia 9,kolumna 17:
PL / SQL:ORA-00936:brakwyrażenia
ORA-06550:linia 9,kolumna 2:
PL / SQL:忽略SQL语句
06550. 00000 - “行%s,列%s:\ n%s”
我真的试图找到什么错误,但一切似乎都很好。有人可以帮忙吗?它应该写在每个星期五的输出上,这是月份的第13天。
答案 0 :(得分:1)
您的代码中存在许多错误:
首先:你应该使用正确的日期文字。我更喜欢ANSI文字,比如DATE '2001-01-01'
,但您也可以使用to_date()
函数:`to_date('2001-01-01','yyyy-mm-dd')
第二:to_char()
返回varchar值,而不是数字。因此,您无法将结果分配给数字变量,您需要使用to_number(to_char(dateof21,'D'))
。
您也无需使用select ... into
来调用函数。
最后:extract()
方法不需要使用date
前缀:EXTRACT(day from dateof21)
将所有这些放在一起,给我们:
DECLARE
dateof21 DATE;
dzien number;
dzien_tyg number;
BEGIN
dateof21 := date '2001-01-01';
-- alternatively: dateof21 := to_date('2001-01-01', 'yyyy-mm-dd');
WHILE dateof21 <> DATE '2101-01-01'
LOOP
dzien := EXTRACT(day from dateof21);
dzien_tyg := to_number(to_char(dateof21,'D'));
if ((dzien=13) AND (dzien_tyg=5)) THEN
dbms_output.put_line(to_char(dateof21, 'yyyy-mm-dd'));
end if;
dateof21 := dateof21+1;
END LOOP;
END;
/
请注意,to_char(dateof21,'D')
的返回值取决于您的NLS设置。在所有配置中,您都不能依赖始终返回5
周五(例如,在我的计算机上返回6
)。