pl / sql块,简单脚本的奇怪错误

时间:2015-10-22 11:45:06

标签: oracle plsql

我在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天。

1 个答案:

答案 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)。