Tuesday, June 2, 2009

ORA-01843: not a valid month geçersiz ay

ORA-01843: not a valid month bu hata ile kaşılaştıgınızda netten bir dünya çözum cıkacaktır. bunlar genelde format tipleri ile ilgili çözumler. birde şöle bir çözum var.
biz türkler nls_lang değerini turkish yapıyoz da ondan oluyor birde.

select * from nls_session_parameters; diyerek parametreleri görünüz.
PARAMETER VALUE
------------------------------ -----------------------------
NLS_LANGUAGE TURKISH
NLS_TERRITORY TURKEY
NLS_CURRENCY TL
NLS_ISO_CURRENCY TURKEY
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RRRR
NLS_DATE_LANGUAGE TURKISH
NLS_SORT TURKISH
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD/MM/RRRR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RRRR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY YTL
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
17 satırları seçildi.

şimdi hatayi üretelim ve çözümüne bakalim


DECLARE

test_date
DATE;

day_of_week
VARCHAR2(3);

years_ahead
INTEGER;

BEGIN

test_date
:= TO_DATE('01-jan-1997','dd-mon-yyyy'); /*burada jan değerine dikkat januaryden geliyor*/

FOR years_ahead IN 1..10 LOOP

day_of_week
:= TO_CHAR(test_date,'Dy');

IF day_of_week IN ('Sat','Sun') THEN

DBMS_OUTPUT
.PUT_LINE(TO_CHAR(test_date,'dd-Mon-yyyy')|| ' A long weekend!');

ELSE

DBMS_OUTPUT
.PUT_LINE(TO_CHAR(test_date,'dd-Mon-yyyy')|| ' Not a long weekend.');

END IF;

test_date
:= ADD_MONTHS(test_date,12);

END LOOP;

END;

/

bu kod çalıştığında

1 satırında HATA:
ORA-01843: geçerli bir ay değil
ORA-06512: konum satır 6 hatası ürüyor neden bizde ocak ayının oca sı var january jan ı yok :)
test_date := TO_DATE('01-jan-1997','dd-mon-yyyy'); satırında jan yerine oca yazın çatır çatır çalışacaktır.

1 comment:

Anonymous said...

Merhaba benim sql im
select last_day(add_months(?, ? )) + 1 vv_date from dual;
şeklinde idi ve birinci değişken dd.mm.yyyy şeklinde tarih ikinci değişken int 1 di, yazdığınız testleri yaptım herhangi bir sorun vermedi. daha sonra tarihi sql de to date olarak değiştirip yolladım sorun çözüldü.Sorunsuz çalaışan hali:
select last_day(add_months(to_date(?,'dd.mm.yyyy'), ? )) + 1 vv_date from dual