Mevlüt Becerikli

Basit diye bir ÅŸey yok !!! Bilmeyene 2+2 bile zor…

Kasım 2009 için arsiv

Dizin Hafıza Bilgisi (FILE Sınıfı)

Yazan: Mevlüt Becerikli Tarih: Kas 24th, 2009 | Kategori:: Java

Java Programlama Dili ile bilgisayarınızın hafıza bilgisini görmeniz için bir kaç satırlık karalama…

Code :

File[] files = File.listRoots();
for (File f : files)
if (f.exists() && f.isDirectory()) {
System.err.println(f);
System.out.println(”TOPLAM HAFIZA : ” + f.getTotalSpace() / 1024 / 1024 / 1024) + ” GB”;
System.out.println(”BOS  HAFIZA : ” + f.getFreeSpace() / 1024 / 1024 / 1024) + ” GB”;
System.out.println(”KULLANILABILIR HAFIZA : ” + f.getUsableSpace() / 1024 / 1024 / 1024) + ” GB”;
}

Ekran Çıktısı :

C:\
TOPLAM HAFIZA (GB) : 232 GB
BOS  HAFIZA (GB) : 193 GB
KULLANILABILIR HAFIZA (GB) : 193 GB
D:\
TOPLAM HAFIZA (GB) : 232 GB
BOS  HAFIZA (GB) : 125 GB
KULLANILABILIR HAFIZA (GB) : 125 GB

İyi Çalışmalar…


ALL_TAB_COLUMNS

Yazan: Mevlüt Becerikli Tarih: Kas 24th, 2009 | Kategori:: Oracle, Veritabanı

Soru-1 :

Oracle’ da BLOB tipinde veri içeren tabloları nasıl bulabilirim. Hatta bu veritipi hangi sütun için kullanılmakta?

Çözüm-1 :

SELECT * FROM all_tab_columns WHERE data_type = ‘BLOB’

Soru-2 :

Oracle’ da içinde DESC ifadesi geçen kolonları bulumak istiyoruz. Nasıl ?

Çözüm-2 :

SELECT *
FROM all_tab_columns a
JOIN all_objects b
ON b.owner = a.OWNER
AND b.object_name = a.TABLE_NAME
WHERE UPPER(a.column_name) LIKE ‘%DESC%’
AND b.object_type = ‘TABLE’

NOT : 2. SQL ifademizde all_object tablosu ile JOIN iÅŸlemine tabi tutup object_type alanına bakmamızın nedeni. VIEW tipindeki sütun adlarına dikkate almamaktı. Bilgilerinize…


ALL_TAB_COLUMNS sistem tablosunun barındırdığı bilgiler hakkında fikir sahibi olalım…

İyi Çalışmalar…


Extract Only Numbers From The Columns

Yazan: Mevlüt Becerikli Tarih: Kas 24th, 2009 | Kategori:: Oracle, PL/SQL, Veritabanı

Bir forum da Oracle sorusu olarak gelen Extract Only Numbers From The Columns başlıklı bir soruya verdiğim cevabı paylaşmak istedim.  Bir IT sakini, bir Oracle tablosundaki bir sütun verisi içindeki sayısal değerleri nasıl alabileceğini soruyordu. Hemen aşağıdaki komutlar kümesi ile bir tablo oluşturup bir kaç kayıt ekledim.

CREATE TABLE  TEST_DETAY
(
ID           VARCHAR2(50 BYTE),
DESCRIPTION  VARCHAR2(100 BYTE)
)

INSERT INTO test_detay values (1,’duyuru 49600 üyeye gönderildi’);
INSERT INTO test_detay values (2,’ilan edildi (53988 üye)’);
INSERT INTO test_detay values (3,’Baska üye kalmadi :)’);
INSERT INTO test_detay values (4,’38854 kullanici baglanti kurdu’);
INSERT INTO test_detay values (9,’Tüm kullanicilar üye mi? 38854 kullanicidan “çok azı” üye (tahmini 31111) ‘);

Akabininde, aşağıdaki gibi bir cursor ile tüm kayıtları dolaşan, her kayıttaki karakterleri tarayıp sayısal değerleri ekrana basan bir PL/SQL Bloğu yazdım. İlk aklıma gelen çözüm bu idi.

DECLARE
varStr    VARCHAR2(100);
rslt      VARCHAR2(100);
splitter  VARCHAR2(100) := ”;
BEGIN
FOR myCursor IN (SELECT id, description FROM test_detay) LOOP
varStr := myCursor.description;
FOR i IN 1..LENGTH(varStr)
LOOP
splitter := SUBSTR(varstr,i,1);
IF (INSTR(’0123456789′,splitter) > 0) THEN
rslt := rslt || splitter;
ELSE
IF (LENGTH(rslt) > 0) THEN
DBMS_OUTPUT.PUT_LINE(myCursor.ID || ‘ - ‘ || rslt);
rslt := ”;
END IF;
END IF;
END LOOP;
rslt := ”;
END LOOP;
END;

Bir baÅŸka hocam (BiliÅŸim sektöründe herkes hoca olmasından…) aÅŸağıdaki gibi bir SQL ifadesi yollamış. Bu SQL ifadesi de, saysal deÄŸer içeren kayıtları (sayıları deÄŸil) getirmektedir.

SELECT  * FROM  test_detay WHERE regexp_like (description, ‘[[:digit:]]’)

REGEXP kütüphanesini de incelemeye aldım. En kısa zamanda, Regular Expression ile alakalı yazılara kadar görüşmek dileÄŸiyle…
İyi Çalışmalar…

SYS/SYSTEM Kullanıcısının şifresini mi unuttunuz ???

Yazan: Mevlüt Becerikli Tarih: Kas 20th, 2009 | Kategori:: Oracle, Veritabanı

Böyle bir durumda, umarım iÅŸletim sisteminize giriÅŸ yaptıgınız kullanıcınız Oracle DBA Grubu’ na dahildir.
Çünkü Oracle veritabanı oturumumuzu açarken ki kimlik denetimi (Authentication) şeklimizi İşletim Sistemi bazlı olacaktır.

Öncelikle veritabanımızın ve Listener servislerinin başlatılmış olduğundan emin olun. Unutmayın ki şifrenizi geri alamayacak, yeni bir şifre belirleyeceksiniz. Daha sonra komut satırından SYSDBA olarak giriş yapıcaz. Daha sonra şifrenizi değiştiricez.  Bu nasıl olacak derseniz buyrun birlikte bakalım;

C:> sqlplus /nolog
SQL> connect / as sysdba
SQL> alter user sys identified by <yeni_sifre>;

Eğer kullanıcıadı/şifre ile bağlanmak istiyorsanız, mesela connect username/password@instancename , ORAPW sayesinde yeni bir şifre dosyası oluşturmamız gerek. Bunun için, $ORACLE_HOME altındaki veritabanı dizini altında bulunan dosya ismi orapw<SID> formatında olan bir dosyayı kullanıcaz. Bu veritabanımızın şifre dosyasıdır.  Bu dosya ile birlikte aşağıdaki komutu, komut satırından çalıştırarak yeni bir şifre dosyası (Password File)  oluştururuz;

C:> orawpd file=$ORACLE_HOME/database/orapwd<SID> password=<password> entries=5

Burada ki parametreleri açıklarsak;

  • file : ÅŸifre dosyasının ismi
  • password : sys kullanıcısı için yeni ÅŸifremiz
  • entries : sys kullanıcısı kaç kiÅŸi oturum açabilir

İnternet üzerinde yaptığım araştırmalar sonucu aşağıdaki gibi bir yol da denenebilir;

  1. Oracle kullanıcısı işletim sistemimize ile login olduk
  2. $ORACLE_HOME/network/admin/sqlnet.ora dosyasının içeriğini değiştirmek için açtık.
    cd $ORACLE_HOME/network/admin
    ed(vi) file sqlnet.ora
  3. SQLNET.AUTHENTICATION_SERVICES = (NONE) ile başlayan satırın başına # koyarız.
    #SQLNET.AUTHENTICATION_SERVICES = (NONE)
  4. sqlplus /nolog ile SQL*PLUS uygulamasına gireriz (Oracle 8i ve önceki versiyonlar için svrmgrl).
  5. Daha sonra hiç bir şifreye ihtiyaç duymadan giriş yaparız
    connect sys as sysdba

İyi Çalışmalar…


Java’ da Sekizlik Sistem (Octal Numbers)

Yazan: Mevlüt Becerikli Tarih: Kas 19th, 2009 | Kategori:: Java

Kod :

ArrayList a = new ArrayList();
a.add(0);
a.add(1);
a.add(011);
a.add(012);
a.add(045);
Iterator itr = a.iterator();
while(itr.hasNext()){

Integer o = (Integer)itr.next();
System.out.println(”Array Values : “+o);

}

Sonuç :

Array Value : 0
Array Value : 1
Array Value : 9
Array Value : 10
Array Value : 37

Sizce bu iÅŸte bir terslik yok mu? Nedense kod içinde yazdığımız sayılar ile ekranda çıkanlar aynı deÄŸil gibi…
Kod içinde aşağıdaki gibi bir değişiklik yaptım ama gene değişen bir şey olmadı. Acaba neden?

add(new Integer(0));
add(new Integer(1));
add(new Integer(011));
add(new Interger(012));
add(new Integet(045));

Hemen açıklamaya çalışalım;

Bir sayının başına “0″ eklersek, bu derleyiciye bu sayının matematiksel olarak sekizlik (octal) sistemde olduÄŸunu ifade etmektir.  Derleyici de bunu göze alarak 0-7 arasında olan her rakam bu kapsamda deÄŸerlendirir. DiÄŸer rakamlar (08 yada 09) kabul görmez. Bu sayede Java derleyicisinin bir huyunuda öğrenmiÅŸ olduk :-)

Bu konuda (Octal Numbers) daha detaylı bilgi için aÅŸağıdaki link güzel bir kaynak olabilir…

http://java.about.com/od/o/g/octal.htm

İyi Çalışmalar…


Oracle Hata kodları

Yazan: Mevlüt Becerikli Tarih: Kas 19th, 2009 | Kategori:: Oracle

Oracle ile ilgilenen herkes mutlaka bir hata ile karşılaşmıştır. Benim gibi daha yolun başında olan arkadaşlar için, bu hata kodları bazen çok manalı olmayabiliyor :-)
Bu açıdan karşılaştığım bir link hoşuma gitti. İlgili hata kodunu yazarak hata kodunu/mesajını daha anlamlı hale getirmek isterseniz denemeye değer;

http://www.dbmotive.com/oracle_error_codes.php

İyi Çalışmalar…


PL/SQL - Ascii Fonksiyonu

Yazan: Mevlüt Becerikli Tarih: Kas 19th, 2009 | Kategori:: Oracle, PL/SQL, Veritabanı

Bu yazıda da, gene bir forum da karşılaÅŸtığım sorunun çözümünü irdelerken tanıştığım ASCII fonksiyonunu tanıyacağız. Bu fonksiyonlar ezberlenemeyecek kadar çok. Ama en azından aklınızın bir köşesinde olması açısından okumakta fayda var diye düşünüyorum…

Sorun, test_table tablomuz ve buna ait clmn isimli bir sütunumuz var.  İçindeki veriler de aşağıdaki gibi;

123
456
abc
def

İstenilen ise karakter değeri içeren leri elde etmek Yani çıktı aşağıdaki gibi olacak;

abc
def

Bu noktada ilk akla gelen çözüm (Tablo oluşturmadan veri kümesinide oluşturarak) aşağıdaki gibi oldu;

WITH
test_table AS (
SELECT ‘123′ clmn FROM dual UNION ALL
SELECT ‘456′ clmn FROM dual UNION ALL
SELECT ‘abc’ clmn FROM dual UNION ALL
SELECT ‘def’ clmn FROM dual
)
SELECT clmn FROM  test_table
WHERE ASCII(clmn) NOT BETWEEN 48 AND 57
ORDER BY clmn ASC

Burda ASCII fonksiyonunun yaptığı, parametre olarak aldıgı karakterin ASCII karşılığı olan nümerik değeri verir. Bu bir değer olduğu gibi birden çok değer de olabilir. Bu durumda çalışma mantığı ise, fonksiyon sırası ile her ifadeye bakar ve ilk buldugu karakter tipindeki ifadenin ASCII karşılığını verip sonrasında gelen ifadelere bakmadan bu değeri döner.

Not : ASCII karakterlerim tam listesine eriÅŸmek için aÅŸağıdaki linli kullanabilirsiniz…
http://www.techonthenet.com/ascii/chart.php

Bilgilerinize…

İyi Çalışmalar…


CONNECT BY Kazası

Yazan: Mevlüt Becerikli Tarih: Kas 18th, 2009 | Kategori:: Oracle, PL/SQL, Veritabanı

Enteresan bir blog yazı baÅŸlığı olduÄŸunu itiraf etmeliyim. 1 gün öncesine kadar bana da öyle geliyordu. Tâki Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 ile Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 arasındaki farkın yazdıgımız bir PL/SQL fonksiyonunda farklı sonuçlar verene kadar.  Gördüğünüz gibi, versiyon olarak çok da büyük bi farklılık yok gibi. Biri test diÄŸeri gerçek ortam olan 2 veritabanımız bunlar. Nedir mi fark? Buyrun bakalım…

BildiÄŸimiz gibi CONNECT BY ifadesi 1′ den N e kadar kaydı herhangi bir tablo, verit tabanı objesi veya taklalara gerek kalmadanelde etmemizi saÄŸlıyordu. Örnek sorgumuz;

SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM<10

Oracle 10g’ nin 10.2 versiyonunda bu sorgu 1…10 arası 10 kayıt getirirken, aynı sorgu 10.1 versiyonun da  1…9 arası 9 kaydı ekrana getirmektedir.

Biraz googling yapınca daha enteresan bir ÅŸey okudum. Aynı sorgu 9.2 versiyonunda 1…9 arası 9 kayıt getirmekte. Valla benim kafam baya karıştı :-)

Hangisi doÄŸru bilemem ama bu özel Oracle ifadesini kullanırken buna dikkat etmenizi öneririm…

İyi Çalışmalar…


POI API Event

Yazan: Mevlüt Becerikli Tarih: Kas 18th, 2009 | Kategori:: Java

Tekrar merhabalar,

Daha önceden POI API si ile bir excel dökümanını okumaya çalıştığımız bir paylaşımımız olmustu. İlk izlenimlerimi paylaÅŸmak istemiÅŸtim. Biraz daha inceleme fırsatı bulunca, POI API Event mekanizması ile tanıştım. Bu konuda da bir yazı okudum.  Biraz da Eclipste haşır neÅŸir olunca ortaya çıkanları paylaÅŸmak istedim.  Bu POI API Event ile ilgili ilk yazımız olcak. POI API Event‘ in en dikkat çeken avantajı, XLS dosyalarını daha az hafıza kullanarak okumasıymış.

İlk olarak, API’ yi kullanmak için önce ilgili sınıfımız HSSFListener interface’ ini implemente etmesi gerekiyor.  Bu interface bize processRecord(Record record) metodunu override etmemizi isteyecektir. Daha sonra bu metod bizim satır satır verileri almamızı ve iÅŸlememizi saÄŸlayacak.

Bir sonraki aşamada ise, oluşturduğumuz sınıf içinde bir  HSSFRequest nesnesi örnekliyoruz. Bu nesnenin addListener metodu ile sınıfımızı register ediyoruz.

Buna paralel olarak, FileInputStream nesnesi ile XLS dosyamıza baÄŸlantı kurup bu FileInputStream nesnesini POIFileSystem nesnesi örneklerken, constructur metoduna parametre olarak geçiyoruz.  XLS dosyamız  için örnekleyeceÄŸimiz InputStream nesnesinin deÄŸeri olarak da, gene örneklediÄŸimiz POIFileSystem nesnesinin createDocumentInputStream(”Workbook”) metodunu kullanarak atama yapıyoruz.

Şu aşamada, elimizde birer adet POIFileSystem ve HSSFRequest nesnesi mevcut. Bunları bi çatı altında toplayalım :-) Bu çatımızın ismi HSSFEventFactory dir. Bu sınıfın processEvents(request,inputStream) metodu bu işi yapmamıza yardımcı olur. HSSFEventFactory nesnemizin bu metoduna, POIFileSystem ve HSSFRequest nesnelerini parametre olarak geçeriz. Herhangi bir çağırımda, ilk paragrafta basettiğimiz  processRecord(record) metodu karşılayarak dosya başından sonuna kadar satır satır okuma işlemi gerçekleştirilir.

Burdan sonra gelen Record nesnemizi istediğimizi gibi kullanabiliriz. Nasıl mı ?
Onu da bir sonraki yazımızda inceleyelim ama buraya kadar ki açıklamalarımızın kodları aşağıdadır;

public static void main(String[] args) throws IOException
{
FileInputStream fin = new FileInputStream(“ornek.xls”);
POIFSFileSystem poifs = new POIFSFileSystem(fin);
InputStream din = poifs.createDocumentInputStream(“Workbook”);
HSSFRequest req = new HSSFRequest();
req.addListenerForAllRecords(new EventAPIsExample());
HSSFEventFactory factory = new HSSFEventFactory();

factory.processEvents(req, din);
fin.close();
din.close();
}
public void processRecord(Record record)
{
System.out.println(“public void processRecord(Record record)”);
}

NOT: İşlemlerimizi bitince kullandığımız Stream nesnelerimizi ( FileInputStream, InputStream ) kapatmayı unutmuyoruz…

İyi Çalışmalar…