Soru: Boş kaydedilen karakter değeri ile null değeri arasında ne fark vardır? Bir alan üzerinden ='' şeklinde boş bir string sorguladığımda ve null değerleri sorguladığımda farklı değerler elde ediyorum.
Cevap: Boş bir string Oracle'da null bir değeri temsil eder.
Aşağıda oluşturulan kullanici tablosu üzerinden örnek vermek gerekirse.
create table kullanici(kullanici_id number, kullanici_adi varchar2(100));
Şimdi oluşturduğumuz tabloya sırasıyla boş bir değer içeren ve null değeri içeren iki kayıt ekleyelim.
insert into test (kullanici_id, kullanici_adi) values (100, null);
insert into test (kullanici_id, kullanici_adi) values (101, '');
İlk insert cümlesi tabloya kullanici_adi null olan bir değer eklemektedir.
İkinci insert cümlesi ise tabloya boş bir karakter değeri eklemektedir. (iki tek tırnak birleşik şekilde)
Şimdi eklediğimiz değerler üzerinden tablodan sorgu alalım.
Select * from kullanici where kullanici adi = '';
Sorgu sonucu olarak yukarıda boş olarak eklediğimiz değerin dönmesini bekliyoruz fakat sorgu sonucu hiç bir satır getirmeyecektir.
Birde aynı tablodan kullanici adi null olan bilgileri sorgulayalım.
Select * from kullanici where kullanici_adi is null;
Sorgu sonucu olarak eklediğimiz null değeri içeren 1 satır dönmesini bekliyoruz fakat 2 satır döndüğünü görüyoruz.
Bunun sonucu olarak Oracle da boş karakter olarak eklenen değerlerin tablo içerisinde null değerlere eşit olduğunu görüyoruz.
Sırası gelmişken bahsetmekte fayda var, null değerler içeren tablolarda kullanmaya alışkın olduğumuz (=,<,>,v.s.) gibi eşitlik ifadelerini kullanamayız. Bunların yerine null işlemleri için is null veya is not null ifadelerini kullanabiliriz.
Daha karmaşık sorgular için ise Oracle'daki null kontrolü yapan çeşitli fonksiyonları (NULLIF, NVL, NVL2) kullanabiliriz. Bu fonksiyonlar hakkında daha detaylı bilgi için "Oracle NULL Kontrol Fonksiyonları" başlıklı yazıya göz atabilirsiniz.
Kendi kullandığım bazı notları hızlı erişim sağlayabilmek için bu sayfaya ekliyorum, bilgi paylaştıkça güzeldir (:
15 Aralık 2011 Perşembe
5 Aralık 2011 Pazartesi
Oracle PL/SQL Soru & Cevaplar 2: Bir tablo içerisindeki çiftleyen/duplicate/tekrarlayan değerleri bulup nasıl silebilirim?
Oracle'da tüm tablolar üzerinde default tanımlı olan rowid alanı sayesinde bir tablo içerisinden belirli bir set seçip ve bu seti de rowid alanı üzerinden taşıyarak çiftleyen/duplicate/tekrarlayan kayıtları silebiliriz.
Bu yöntem için yazılmış olan aşağıdaki sql ifadesini incelediğimizde, sorgunun iç kısmındaki select ifadesinde KULLANICI tablosunda bulunan ID değerlerini grupladığını ve bu değerler arasından rowid değeri minimum olan değeri aldığını görüyoruz, ifadenin asıl silme işlemini yapan delete kısmında ise iç sorgudan dönen minimum rowid değerlerinin dışındaki tüm kayıtları NOT IN ifadesi kullanarak silmeye çalıştığını görüyoruz.
DELETE FROM KULLANICI WHERE rowid not in
(SELECT MIN(rowid) FROM KULLANICI K GROUP BY K.ID );
Bu yöntem için yazılmış olan aşağıdaki sql ifadesini incelediğimizde, sorgunun iç kısmındaki select ifadesinde KULLANICI tablosunda bulunan ID değerlerini grupladığını ve bu değerler arasından rowid değeri minimum olan değeri aldığını görüyoruz, ifadenin asıl silme işlemini yapan delete kısmında ise iç sorgudan dönen minimum rowid değerlerinin dışındaki tüm kayıtları NOT IN ifadesi kullanarak silmeye çalıştığını görüyoruz.
DELETE FROM KULLANICI WHERE rowid not in
(SELECT MIN(rowid) FROM KULLANICI K GROUP BY K.ID );
29 Kasım 2011 Salı
Oracle PL/SQL Soru & Cevaplar I: String bir değerin alfanumerik karakter içerip içermediğini test etmek.
Soru: Oracle da string bir değerin alfanumerik karakterler içerip içermediğini nasıl test ederiz?
Cevap: Bir stringi alfanumerik karakterler için test etmek için LENGHT, TRIM ve TRANSLATE fonksiyonlarını birlikte kullanarak test işlemi için bir inline fonksiyon yazabiliriz.
Bu işlem için aşağıdaki fonksiyon kullanılabilir:
LENGTH(TRIM(TRANSLATE(string_deger, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' ')))
string_deger burada sizin kontrol etmek istediğiniz değeri içeren bir string olacaktır. Fonksiyon eğer test ettiğiniz değer alfanumerik ise NULL değer dönecektir, eğer test ettiğiniz veri içerisinde alfanumerik olmayan bir karakter var ise 0 dan büyük olan bir sayı dönecektir.
Örneğin:
select LENGTH(TRIM(TRANSLATE('Veri tabani notlarim!!', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' '))) from dual;
Sorgusu, string içerisinde 2 tane ! işareti bulunduğundan 2 değerini dönecektir.
select LENGTH(TRIM(TRANSLATE('Veri tabani notlarim', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' '))) from dual;
Sorgusu ise NULL değer dönecektir.
Cevap: Bir stringi alfanumerik karakterler için test etmek için LENGHT, TRIM ve TRANSLATE fonksiyonlarını birlikte kullanarak test işlemi için bir inline fonksiyon yazabiliriz.
Bu işlem için aşağıdaki fonksiyon kullanılabilir:
LENGTH(TRIM(TRANSLATE(string_deger, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' ')))
string_deger burada sizin kontrol etmek istediğiniz değeri içeren bir string olacaktır. Fonksiyon eğer test ettiğiniz değer alfanumerik ise NULL değer dönecektir, eğer test ettiğiniz veri içerisinde alfanumerik olmayan bir karakter var ise 0 dan büyük olan bir sayı dönecektir.
Örneğin:
select LENGTH(TRIM(TRANSLATE('Veri tabani notlarim!!', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' '))) from dual;
Sorgusu, string içerisinde 2 tane ! işareti bulunduğundan 2 değerini dönecektir.
select LENGTH(TRIM(TRANSLATE('Veri tabani notlarim', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-.0123456789', ' '))) from dual;
Sorgusu ise NULL değer dönecektir.
24 Kasım 2011 Perşembe
ORACLE PL/SQL Oracle Hata Mesajları I
Geliştirme veya bakım çalışmaları esnasında sürekli karşılaştığımız Oracle hata mesajları hakkında detaylı açıklamayı hızlıca edinebilmek için aşağıdaki siteler kullanılabilir.
http://www.ora-code.com/
http://www.ora-error.com/
Ör: ora-00057 hatasını aldığımızı düşünelim.
http://ora-00057.ora-code.com adresinden spesifik olarak bu hata ile ilgili detaylara erişilebilir.
veya
http://www.ora-error.com/ adresinden aldığımız hatanın kodunu submit ederek hatanın detaylarına erişilebilir.
Konunun devamı olarak Oracle Hata Mesajları II başlıklı yazımda Oracle hata mesajlarını biraz daha derinlemesine inceleyeceğim, aynı zamanda ORacle exception mekanizmalarından ve kullanıcı tanımlı exception tanımlarından bahsedeceğim.
http://www.ora-code.com/
http://www.ora-error.com/
Ör: ora-00057 hatasını aldığımızı düşünelim.
http://ora-00057.ora-code.com adresinden spesifik olarak bu hata ile ilgili detaylara erişilebilir.
veya
http://www.ora-error.com/ adresinden aldığımız hatanın kodunu submit ederek hatanın detaylarına erişilebilir.
Konunun devamı olarak Oracle Hata Mesajları II başlıklı yazımda Oracle hata mesajlarını biraz daha derinlemesine inceleyeceğim, aynı zamanda ORacle exception mekanizmalarından ve kullanıcı tanımlı exception tanımlarından bahsedeceğim.
23 Kasım 2011 Çarşamba
Oracle/PLSQL: Oracle Sistem Tabloları
Oracle/PLSQL:
Oracle Sistem Tabloları
Bütün gerçekten
ilişkisel olan sistemler sistem bilgilerini saklayan alanlara sahiptir. Sistem
bilgilerini içeren bu alanlara diğer alanlar için kullanılan klasik yöntemler
ile erişilebilir. Oracle ilişkisel veri tabanlarında da sistem bilgileri
kullanıcının yetki seviyesine göre erişebildiği tablolarda tutulur. Bu tablolar
kullanılarak sistem bütünü hakkında veya kullanıcının sahip olduğu haklar
çerçevesinde yetkisi olduğu objeler hakkında detaylı bilgiler elde edilebilir.
Sistem tabloları geliştirilen prosedürler veya fonksiyonlar içerisinde
kullanılabilir, sistemin bütünü için detaylı bilgi içerdiğinden dolayı analiz,
istatistik veya karşılaştırma işlemleri için büyük kolaylık sağlarlar. Örneğin
ALL_TABLES sistem tablosu kullanılarak istenilen kullanıcının tüm tabloları
üzerinde analiz yapan bir prosedür yazılabilir.
Aşağıdaki listede
oracle sistem tablolarının alfabetik olarak sıralanmış listesini
bulabilirsiniz. Açıklamaları Türkçe ifade etmeye çalıştım, listenin orjinal
hali için http://www.techonthenet.com/oracle/sys_tables/index.php bağlantısını
kullanabilirsiniz.
Sistem Tablosu
|
Açıklaması
|
ALL_ARGUMENTS
|
Objenin içerisindeki kullanıcı tarafından erişilebilir
argümanlar.
|
ALL_CATALOG
|
Kullanıcı tarafından erişilebilir olan bütün, tablolar, viewlar,
sysnonymler, sequenceler..
|
ALL_COL_COMMENTS
|
Erişilebilir tablo ve viewlardarki kolon yorumları.
|
ALL_CONSTRAINTS
|
Erişilebilir tablolardaki constraint/ilişki kısıtı
tanımlamaları.
|
ALL_CONS_COLUMNS
|
Constraint/ilişki tanımlarının kolon bilgileri.
|
ALL_DB_LINKS
|
Kullanıcı tarafından erişilebilir olan veritabanı üzerinde
tanımlı db linkler.
|
ALL_ERRORS
|
Kullanıcının create etmeye yetkisi olduğu objelerdeki hatalar.
|
ALL_INDEXES
|
Kullanıcının erişebildiği tablolar üzerindeki indexlerin
tanımlamaları.
|
ALL_IND_COLUMNS
|
Erişilebilen tablolardaki index içeren kolonlar.
|
ALL_LOBS
|
Description of LOBs contained in tables accessible to the user
|
ALL_OBJECTS
|
Kullanıcının erişim hakkı olan bütün objeler.
|
ALL_OBJECT_TABLES
|
Kullanıcının erişim hakkı olan bütün obje tablolarının
açıklamaları
|
ALL_SEQUENCES
|
Kullanıcının erişim hakkı olan sequenceler.
|
ALL_SNAPSHOTS
|
Kullanıcının erişim hakkı olan snapshotlar.
|
ALL_SOURCE
|
Kullanıcının create etme hakkı olduğu bütün objelerin kaynak/kod
bilgileri.
|
ALL_SYNONYMS
|
Kullanıcının erişim hakkı olan bütün synonym objeleri.
|
ALL_TABLES
|
Kullanıcının erişebildiği tüm tablolar.
|
ALL_TAB_COLUMNS
|
Kullanıcının tablolarının, viewlarının ve clusterlarının tüm
kolonları.
|
ALL_TAB_COL_STATISTICS
|
Kullanıcının tablolarının, viewlarının ve clusterlarının tüm
kolonları.
|
ALL_TAB_COMMENTS
|
Kullanıcının erişebildiği tablolar ve viewlar üzerindeki yorum
bilgileri.
|
ALL_TRIGGERS
|
Kullanıcı tarafından erişilebilen trigger objeleri.
|
ALL_TRIGGER_COLS
|
Kullanıcının triggerları içerisindeki kolon kullanımları veya
kullanıcı tablolarının üzerindeki triggerların içerisindeki kolon tanımlama
bilgileri.
|
ALL_TYPES
|
Kullanıcının erişim hakkı olan tipler.
|
ALL_UPDATABLE_COLUMNS
|
Güncellenebilir bütün kolon tanımlamaları.
|
ALL_USERS
|
Veritabanın bütün kullanıcıları hakkında bilgiler.
|
ALL_VIEWS
|
Kullanıcı tarafından erişilebilir viewlar.
|
DATABASE_COMPATIBLE_LEVEL
|
Veritabanı uyumluluk seviyesi bilgisini gösterir.
|
DBA_DB_LINKS
|
Veritabanındaki bütün db linkler.
|
DBA_ERRORS
|
Bütün objelerdeki hatalar.
|
DBA_OBJECTS
|
Veritabanındaki bütün objeler.
|
DBA_ROLES
|
Veritabanında bulunan bütün roller.
|
DBA_ROLE_PRIVS
|
Kullanıcılara veya rollere atanmış olan rollerin bilgileri.
|
DBA_SOURCE
|
Veritabanında tutulan bütün objelerin kaynak kodları.
|
DBA_TABLESPACES
|
Veritabanındaki bütün tablo uzaylarının bilgileri.
|
DBA_TAB_PRIVS
|
Veritabanındaki bütün objelerin erişilebilme hakları.
|
DBA_TRIGGERS
|
Veritabanındaki bütün triggerlar.
|
DBA_TS_QUOTAS
|
Veritabanındaki bütün kullanıcılar için tablo uzayları kotaları.
|
DBA_USERS
|
Veritabanındaki bütün kullanıcılar.
|
DBA_VIEWS
|
Veritabanındaki bütün viewlar.
|
DICTIONARY
|
Veritabanındaki bütün sistem tablolarının ve viewlarının
açıklamalarının bulunduğu veritabanı sözlüğü.
|
DICT_COLUMNS
|
Veritabanındaki bütün sistem tablolarının ve viewların kolonlarının
açıklamalarının bulunduğu veritabanı sözlüğü.
|
GLOBAL_NAME
|
Global veritabanı ismi
|
NLS_DATABASE_PARAMETERS
|
Veritabanına ait NLS bilgilerinin değerleri.
|
NLS_INSTANCE_PARAMETERS
|
Veritabanındaki bir instance için NLS bilgilerinin değerleri.
|
NLS_SESSION_PARAMETERS
|
Kullanıcı oturumu için NLS bilgilerinin değerleri.
|
PRODUCT_COMPONENT_VERSION
|
version and status information for component products
|
ROLE_TAB_PRIVS
|
Rollere atanmış olan tablo yetkilendirmeleri.
|
SESSION_PRIVS
|
Kullanıcının yetkileri.
|
SESSION_ROLES
|
Kullanıcı için yetkilendirilmiş roller.
|
SYSTEM_PRIVILEGE_MAP
|
Yetki tip kodlarının açıklamaları. Yetki kod numaraları yetki
kod açıklamaları ile ilişkilendirilmiştir.
|
TABLE_PRIVILEGES
|
Objeler üzerindeki yetkilendirmeler.
|
Kaydol:
Kayıtlar (Atom)
Popüler Yayınlar
-
NVARCHAR ve VARCHAR çok fazla kullandığımız veri tipleri arasında, fakat geçenlerde bir sohbet sırasında iki veri tipi arasındaki farkları t...
-
Kullandığımız Oracle versiyonu bazı özelliklerin kullanılıp kullanılmması açısından önemli olabilir, yeni eklenen özellikleri eski versiyonl...
-
Üzerlerinde parent-child ilişkisi tanımlanmış olan tablolar sayesinde tablolardaki verinin bütünlüğünü korumak daha kolay olabilir, örneğin ...
-
DDL Data Definition Language (DDL) cümleleri veritabanı veya şema yapıları tanımlamak için kullanılırlar. Örneğin: • CREATE - veritabanında ...
-
Tablo üzerinde bir alandaki duplicate, çiftleyen, tekrarlayan, mükerrer kayıtları bulmak ve o kayıt için kaç tane tekrarlayan olduğunu liste...
-
Soru: Oracle da string bir değerin alfanumerik karakterler içerip içermediğini nasıl test ederiz? Cevap: Bir stringi alfanumerik karakterl...
-
Merhaba, Bu yazı sql plus marifetlerini kullanarak iki veritabanı arasında veri kopyalama işlemini nasıl yapabileceğiniz hakkında bilgiler i...
-
Oracle/PLSQL: Oracle Sistem Tabloları Bütün gerçekten ilişkisel olan sistemler sistem bilgilerini saklayan alanlara sahiptir. Sistem ...
-
Gittikçe büyüyen ve data yükü artan tablolar üzerinde sorgu çalıştırmak veya tablo bakımına ait diğer işlemleri gerçekleştirmek zamanla ...
-
MS-SQL kullanmış olanlar bilirler auto increment kolon oluşturmak iki tıklama kadar kolaydır fakat ORACLE a gelince işler biraz farklı yürüy...