1

I'm writing very simple block code in 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;

but i'm getting very annoying errors:

ORA-06550: linia 8, kolumna 26:
PL/SQL: ORA-00936: brak wyrażenia
ORA-06550: linia 8, kolumna 2:
PL/SQL: SQL Statement ignored
ORA-06550: linia 9, kolumna 17:
PL/SQL: ORA-00936: brak wyrażenia
ORA-06550: linia 9, kolumna 2:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"

I really tried to find whats wrong, but everything seems just fine. Can anybody help? it should write on output all fridays which are 13th day of month btw.

0

1 Answer 1

1

There are many things wrong in your code:

First: you should use proper date literals. I prefer ANSI literals, like DATE '2001-01-01' but you can also use the to_date()function: `to_date('2001-01-01', 'yyyy-mm-dd')

Second: to_char() returns a varchar value, not a number. So you can't assign the result of that to a number variable, you need to use to_number(to_char(dateof21,'D')).

You also don't need to use select ... into to call a function.

And finally: the extract() method does not require the use of a date prefix: EXTRACT(day from dateof21)

Putting that all together, gives us:

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;
/

Note that the return value of to_char(dateof21,'D') depends on your NLS settings. You can't rely on it to always return 5 for a friday in all configurations (e.g. on my computer it returns 6).

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much ;p I've just started with PL/SQL so i'm doing stupid mistakes and don`t know much yet ;P

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.