Mevlüt Becerikli

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

DECODE - Count The Number of Columns

Yazan: Mevlüt Becerikli Tarih: Oca 4th, 2010 | Kategori:: Database, Oracle, PL/SQL

Gene bir forum da sorulan güzel bir soruyu paylaşmak istiyorum.

MYID
COL1
COL2
COL3
abc
Y
Y
Y
xyz
N
Y
N
abc
Y
Y
N

Yukarıda ki yapıda ve verileri içeren tablo isminde bir tablomuz olsun. Bizden MYID alanı bazında kaç adet Y değerine sahip olduğumuzun istatistiği isteniyor. Bunu nasıl yaparız ? Önce tablomuzu oluşturup içini dolduralım.

CREATE TABLE tablo (myid varchar2(3),col1 VARCHAR2(1),col2 VARCHAR2(1),col3 VARCHAR2(1));

INSERT INTO tablo VALUES ( ‘abc’,'Y’,'Y’,'Y’);
INSERT INTO tablo VALUES ( ‘xyz’,'N’,'Y’,'N’);
INSERT INTO tablo VALUES ( ‘abc’,'Y’,'Y’,'N’);

Şimdi de istenen SQL sorgusunu yazalım.

SELECT myid, SUM(DECODE(col1, ‘Y’, 1, 0) + DECODE(col2, ‘Y’, 1, 0)+ DECODE(col3, ‘Y’, 1, 0)) AS TOTAL
FROM tablo
GROUP BY myid;

Sonuç mu ?

MYID    TOTAL
abc    5
xyz    1


Oracle Database Express Edition ve Diğerleri…

Yazan: Mevlüt Becerikli Tarih: Oca 4th, 2010 | Kategori:: Database, Oracle

Oracle bildğim kadarı ile 4 versiyona sahiptir.

  • Oracle Enterprise Edition (EE)
  • Oracle Standard Edition (SE)
  • Oracle Standard Edition One (SEO)
  • Oracle Express (XE)

Express Edition, bu versiyonların en basit ve kısıtlı olanıdır. Yani Oracle veritabanını öğrenmeye yeni başlayanların ilk adresi olan versiyonudur. Doğal olarak bazı kısıtlara sahiptir. Bu yazı da bu kısıtları ve diğer versiyonlar hakkında edindiğim genel bilgileri paylaşmaya çalışacağım. Öncelikle hangi oracle versiyonunu kullandığımızı bize veren SQL ifadesini paylaşalım;

SELECT *  FROM V$version;

Sonra bu Oracle Database Express Edition kısıtları:

  • Express Edition, herhangi bir server da sadece tek bir INSTANCE ile sınırlıdır. Yani bir bilgisayarda sadece tek bir Oracle XE çalışabilir.
  • Express Edition, birden çok CPU ya sahip bir server a yüklenebilsede sadece bir işlemciyi kullanıp bu işlemci üzerinde çalışabilir
  • Express Edition, sadece 4 GB lık kullanıcı verisini destekler. Buna Express Edition system verisi dahil değildir.
  • Express Edition, kullanılabilir RAM hafızasından maksimum 1 GB RAM ına kadar kullanabilir.

Diğer oracle versiyonları kendilerine ne kadar para verdiğiniz ile doğru orantılı olarak özellik olarak da size yol, su, elektrik olarak dönmektedir :-)

Ama genel olarak 3 ana kategoride özellikler değişiklik göstermektedir: Kullanacağı Sunucu Çapı, Özellikler ve kullanabilir opsiyonlar. Bu versiyonlar ile ilgili okuduğum bir yazıyıda paylaşmak isterim.

Understanding Oracle features and options

Ek olarak da kullanmakta olduğunuz Oracle veritabanının özelliklerinin detay bilgisini aşağıdaki SQL ifadesi iel almanızada mümkün :

SELECT *  FROM V$option;

Yada ;

http://www.oracle.com/database/product_editions.html


Redo Log Member Ekleme

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle

Okuyup öğrencikçe paylaşmaya devam…
Bir REDO LOG GROUP’ una yeni bir REDO LOG MEMBER’ ı nasıl ekleyeceğimizi görelim :

ALTER DATABASE ADD LOGFILE MEMBER
/DISK2/log1b.rdo’ TO GROUP 1,
‘/DISK2/log2b.rdo’ TO GROUP 2;

Daha detaylı bilgi için aşağıdaki linki incelemenizi öneririm:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/onlineredo.htm#sthref946


CONTROL FILE dosyasını açıp incelemek

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle

Öncelikle bilgimiz olsun diye mevcut Control File dosyalarımızın nerde olduğunu öğrenelim:

  • SQL*Plus :
    SHOW PARAMETERS control_files;
  • Query :
    SELECT * FROM v$controlfile;

Control File içeriğini herhangi bir editör ile okumamız pek mümkün değil.  Bunu Control File’ ı yedekleyerek yapmamız mümkün. Bunu da 2 şekilde yapabiliriz;

  1. ALTER DATABASE BACKUP CONTROLFILE TO TRACE ;
    Bu ifade ile USER_DUMP_DEST parametresinin gösterdiği yere yedekleme işlemi gerçekleşir. Burdaki .trc dosyasını uygun bir text editörü ile açıp inceleyebilirsiniz.
  2. ALTER DATABASE BACKUP CONTROLFILE TO ‘C:\yedek.txt’ ;
    Bu yöntem de Binary bir dosya oluşturacaktır.

Aşağıdaki linkten de Control File genel yapısı ve ne gibi bilgiler içerdiğini inceleyebilirsiniz. http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/physical.htm#BJEDFGDD


Join - Subquery - Inline Query

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, SQL

Bu yazımızda da JOIN, SUBQUERY ve INLINE QUERY ifadelerinin yapısal farklılıklarını birer örnek ile ele alacağız. Aşağıdaki gibi 4 tablomuz olduğunu düşünelim.

TABLO ADI SUTUN1 SUTUN2 SUTUN3 SUTUN4 SUTUN5
EMPLOYEES ID NAME D_ID JOB_ID SALARY
DEPARTMENTS D_ID LOC_ID D_NAME
LOCATION LOC_ID LOC_NAME
JOB JOB_ID JOB_TITLE

Şimdi 1800 numaralı (JOB_ID) işe için çalışan, departman, iş ve lokasyon bilgilerini bu 4 tablodan çekmek isteyelim.

JOIN : İlk aklımıza gelen ilgili anahtar alanların birbirine eşitlik durumu ile JOIN işlemi olacaktır.

SELECT d.d_name, l.loc_name,  j.job_title,  e.salary
FROM employees e,  departments d, location l, job j
WHERE e.d_id = d.d_id
AND e.job_id = j.job_id
AND d.loc_id = l.loc_id
AND e.job_id = 1800

SUBQUERY : Genel itibarı ile kendisindan başka bir SQL ifadesinin içinde parantezler içinde olan SQL ifadesidir. Bir SQL ifadesinin ya SELECT kısmında yada WHERE kısmında olur. SUBQUERY, her tablo için sadece bir kere değerlendirilir.

SELECT d.d_name, (SELECT l.loc_name FROM location l where l.loc_id = d.loc_id) , j.job_title, e.salary
FROM employees e , departments d , job j
WHERE e.d_id = d.d_id
AND e.job_id = j.job_id
AND e.job_id = 1800

INLINE QUERY (INLINE VIEW) : Eğer SUBQUERY ifadesi, ana SQL ifadesinin FROM kısmında ise buna INLINE QUERY (INLINE VIEW) diyoruz. Burada amaç kompleks bir JOIN işleminin yerine daha sade bir SQL ifade elde etmek yada birbirinden ayrık SQL ifadelerini bir SQL ifadesi içinde elde etmektir.

SELECT e.salary, j.job_title , s.d_name , s.loc_name
FROM employees e ,job j,
(SELECT d.d_name, l.loc_name, d.d_id FROM departments d , location l WHERE d.loc_id = l.loc_id ) s
WHERE e.d_id = s.d_id
AND e.job_id = j.job_id
AND e.job_id = 1800


String & StringBuffer arasındaki sıkça sorulan fark

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Java

String (bknz.) :

  • String, değişmez (immutable) veri tipidir. Dolayısıyla, değişmeyen karakter dizeleri için kullanılır.
  • Biraz daha açmamız gerekirse , String tipi static olduğundan bir veri değiştirdiğimizde, yeni bir String tipinde referansa (değişkene) atama işlemini yapar. Eski referans (değişken) serbest bırakılır. Örn:

String str = “Merhaba”;
str = str.concat(“ Dünya”);

Burada 3 adet String nesnesi oluşur (“Merhaba”,” Dünya”,” Merhaba Dünya”), ikisinin referansı (“Merhaba”,” Dünya”) serbest bırakılır.

  • Görüldüğü gibi String otomatik olarak örneklenir.

StringBuffer (bknz.):

  • StringBuffer, değişebilir (mutable) veri tipidir. Dolayısıyla, değiştirilebilir karakterler için kullanılır.
  • Aynı örneği StringBuffer ile yapıp karakter işlemlerinin aynı referansta yapıldığını öğrenelim :

StringBuffer strBuff = new StringBuffer(”Merhaba “);
strBuff.append(” Dünya”);

Burada 2 adet StringBuffer nesnesi oluşur (“Merhaba”,” Merhaba Dünya”), birinin referansı (“Dünya”) serbest bırakılır. “Dünya” nesnesi “Merhaba” nesnesinin sonuna eklenir.

  • Görüldüğü gibi StringBuffer, NEW anahtar sözcüğü ile örneklenir.

SELECT…INTO ile NO_DATA_FOUND Hatası

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle, PL/SQL

Bazen SQL ifadelerimizin sonucunda bir kayıt dönmeyebilir. Biz de SELECT… INTO ifadesini kullanırsak o zaman bu bizim başımıza biraz sorun açabilir. Bu hatayı kontrol etmek de çok bilndik bir şey ama kayıt altına alalım;

BEGIN

SELECT empno INTO v_empno FROM emp WHERE ename = ‘MEVLUT’;

EXCEPTION
WHEN no_data_found THEN

<<Burda istediğiniz işlemi yapabilirsiniz>>

END;

Bir diğer yöntem de NVL fonksiyonunu kullanarak, kayıt dönmemesi halinde DEFAULT bir değer de atayabiliriz;

SELECT NVL(empno,0) INTO v_empno FROM emp WHERE ename = ‘MEVLUT‘;

İyi Çalışmalar…


ROLE / USER a hak atamak arasındaki fark ?

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle

Soru :

Bir ROLE e hak atamak ile bir USER a hak atamak arasındaki fark nedir ?

Cevap :

GRANT ve REVOKE ifadeleri DDL (Veri Tanimlama Dili - Data Definition Language) ifadeleridir. Eğer bir kullanıcıya bir hak tanımlarsak bu COMMIT ile anında Veri Kütüğüne (Data Dictionary) kaydedilip tüm oturumlarda geçerli olacak ve diğer kullanıcılar bu bilgiyi görebilecektir.

Buna rağmen aynı mantık ROLE’ e hak atama da geçerli değildir. Bir ROLE’ e hak atarsan, sonrasında ROLE, kullanıcıya atanabilir. Sonra bu kullanıcı SET ROLE ile o ROLE’ ü disable yapabilir. Fark burada ortaya çıkıyor ki, SET ROLE ifadesi sadece mevcut veritabanı oturumu için geçerlidir. Bu yüzden diğer oturumlar bu değişim göremeyecekler.


CREATE TABLE & CREATE ANY TABLE farkı

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle

Soru :

CREATE TABLE ile CREATE ANY TABLE hakları arasındaki fark nedir ?

Cevap :

Eğer CREATE TABLE hakkına sahipseniz, Kendi şemanızda bir tablo oluşturabilirsiniz.
Eğer CREATE ANY  TABLE hakkına sahipseniz, sadece kendi şemanızda değil herhangi bir şemada tablo oluşturabilirsiniz. Ayrıca EXTERNAL TABLE oluşturmak içinde CREATE ANY  TABLE hakkına sahip olmalısınız.


Sütun İsimlerini Elde Etmek

Yazan: Mevlüt Becerikli Tarih: Oca 3rd, 2010 | Kategori:: Database, Oracle, PL/SQL

Önce bir tablo yaratalım;

CREATE TABLE tablo (sutun1 VARCHAR2(1), sutun2 VARCHAR2(1), sutun3 VARCHAR2(1));

Sonra sürun isimlerini user_tab_columns View’ inden elde edelim;

SELECT column_name FROM user_tab_columns WHERE table_name=’TABLO’

COLUMN_NAME
————-
SUTUN1
SUTUN2
SUTUN3

Şimdi bu sütunları yan yana elde edelim;

WITH test_data as (

SELECT column_name FROM user_tab_columns WHERE table_name=’TABLO’

)
SELECT *
FROM ( SELECT LTRIM(SYS_CONNECT_BY_PATH(column_name, ‘,’), ‘,’) AS deger
FROM ( SELECT column_name, LAG(column_name) OVER (ORDER BY column_name) AS prev_column_name FROM test_data )
START WITH prev_column_name IS NULL
CONNECT BY prev_column_name = prior column_name
ORDER BY 1 DESC
)
WHERE ROWNUM = 1

DEGER
———-
SUTUN1,SUTUN2,SUTUN3

Umarım faydalı olmuştur…