10 September 2006

Text Punctuation Correction Techniques With Oracle

Daha önceki yazılarımda Oracle 10G ile gelen Regular Expression lardan bahsetmiştim. Bu sayede çok karmaşık pattern ları bulup istediğiniz ölçüde değiştirebilirsiniz. Aşağıda bununla ilgili yapmış olduğum bir çalışmanın örnegi bulunmaktadır. Örnek içinde yapılanlar:
  • Noktalama işaretlerinden sonra gelen boşlukları silmek.
  • Noktalama işaretlerinden sonra bir boşluk karakteri bırakmak.
  • Tekrar eden noktalama işaretlerine karışmamak.("..." gibi)
DECLARE
orginal_str VARCHAR2(1024) := 'Hi everybody.    Everything is good.Great...Yes!You are,the best!!!';
modified_str VARCHAR2(1024);
BEGIN
modified_str := regexp_replace(orginal_str,
'([[:punct:]]+)([[:space:]]*)',
'\1 ',
1,
0);
dbms_output.put_line(orginal_str);
dbms_output.put_line(' modified to ');
dbms_output.put_line(modified_str);
/*
Hi everybody.    Everything is good.Great...Yes!You are,the best!!!
modified to
Hi everybody. Everything is good. Great... Yes! You are, the best!!!
*/

END;

Impilicit Casting On Pirimitive Types In Oracle

Birçok programlama dilinde olduğu gibi Oracle'nin PL/SQL'i de implicit olarak cast yapmaya izin vermektedir. Ama PL/SQL'de durum biraz farklıdır. Sadece benzer tipler arasında değil(int-double), farklı tiper arasında da bu duruma izin verilmektedir. Önemli olan kaynak tipin, hedef tipe göre uyumlu olmasıdır. Yani "123d" stringini rakama dönüştüremezsiniz.

10G ile yaptığım örnekte durumu görebilirsiniz:

DECLARE
varchar_arg VARCHAR2(128);
number_arg NUMBER := 123;
date_arg DATE := SYSDATE;
BEGIN
--impilicit cast number -->> varchar
varchar_arg := number_arg;
dbms_output.put_line(varchar_arg);
--123

--impilicit cast date -->> varchar
varchar_arg := date_arg;
dbms_output.put_line(varchar_arg);
--10/09/2006

--impilicit cast varchar -->> number
varchar_arg := '456';
number_arg := varchar_arg;
number_arg := number_arg + 4;
dbms_output.put_line(number_arg);
--460

--impilicit cast varchar -->> date
varchar_arg := '10/09/2006';
date_arg := varchar_arg;
date_arg := date_arg + 1;
dbms_output.put_line(date_arg);
--11/09/2006

END;

Bunların dışında Oracle çok geniş opsiyonları olan to_number, to_char ve to_date gibi built-in fonksiyonlar ile expicit cast e de izin vermektedir.

09 September 2006

How To Extract Date Values In Oracle

Kimi zaman uygulamalar içinde tarih değerleri arasındaki farkları alıp kullanabilirsiniz. Oracle'da iki tane date tipi ile normal sayısal değerler arasında fark almak gibi işlem yapılır. Sonuç gün cinsinden numerik olarak döner. İstediğiniz formata dönüştürebilirsiniz. Şöyleki;
DECLARE
start_date DATE;
end_date DATE;
time_difference NUMBER;
time_difference_in_seconds NUMBER;
time_difference_in_minutes NUMBER;

BEGIN
start_date := to_date('09.09.2006 09:57:49',
'DD.MM.YYYY HH24:MI:SS');
end_date := to_date('09.09.2006 09:59:34',
'DD.MM.YYYY HH24:MI:SS');
time_difference := end_date - start_date;

time_difference_in_seconds := time_difference * 86400; --24*60*60
time_difference_in_seconds := trunc(time_difference_in_seconds, 4);

time_difference_in_minutes := time_difference * 1440; --24*60
time_difference_in_minutes := trunc(time_difference_in_minutes, 4);

dbms_output.put_line('Start Time : ' ||
to_char(start_date, 'DD.MM.YYYY HH24:MI:SS'));
dbms_output.put_line('End Time : ' ||
to_char(end_date, 'DD.MM.YYYY HH24:MI:SS'));
dbms_output.put_line('Difference in seconds :' ||
time_difference_in_seconds);
dbms_output.put_line('Difference in minutes :' ||
time_difference_in_minutes);
END;

Çıktı ise
Start Time : 09.09.2006 09:57:49
End Time : 09.09.2006 09:59:34
Difference in seconds :105
Difference in minutes :1,75

Fark alma işleminin birçok yolu bulunmaktadır. Ben sadece birini aktardım.