8 Kasım 2012 Perşembe

Oracle: Veritabanları arası veri kopyalama işlemi

Merhaba,
Bu yazı sql plus marifetlerini kullanarak iki veritabanı arasında veri kopyalama işlemini nasıl yapabileceğiniz hakkında bilgiler içermektedir.
Çoğu zaman üretim ortamında bulunan veriyi test ve geliştirme ortamlarında da oluşturup test veya performans amaçlı çalışmalar yapmak isteriz.
Burada en büyük problem genel olarak veri kaynağı bulamamak veya veriyi üretim ortamlarından taşırken karşılaştığımız zorluklardır.
Uzun lafın kısası bu tarz işlemler için ben aşağıdaki şekilde veri taşıma işlemleri gerçekleştiriyorum, yöntemin tabiki bazı eksiklikleri var ama işi büyük ölçüde hızlandırdığını söyleyebilirim.


Yöntemin eksikleri şöyle: 
1. Eğer copy cümlesini replace komutu ile birlikte kullanırsak veri içeriği yeni bir tablo oluşturulup bu tablo içerisine kaydediliyor, bu nedenle tablo üzerindeki çeşitli bileşenleri kaybediyoruz (grant, synonym, constraint v.b.) 
2. Eğer replace komutunu kullanmaz ise 


SQL*Plus üzerinde aşağıdaki syntax ile kopyalam işlemini gerçekleştirebilirsizin:

COPY FROM <>/<>@<> TO
          <>/<>@<> REPLACE
          <> USING <>




 

Örnek olarak kullandığım bir işlem çıktısını yapıştırıyorum:
         
SQL*Plus: Release 11.2.0.1.0 Production on Sal Mar 13 10:02:46 2012
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Kullanıcı adını girin: <>
Parolayı girin:
Ba­lantı:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL> COPY FROM prod_user/prod_pass@prod_db TO test_user/test_pass@test_db REPLACE EMPLOYEE USING SELECT * FROM EMPLOYEE

Dizi getirme/bağlama boyutu: 15. (dizi boyutu 15)
Yapıldığında kaydedecek. (copycommit: 0)
Maksimum long boyutu: 80. (long: 80)
--

15 Aralık 2011 Perşembe

Oracle PL/SQL Soru & Cevaplar 3: Boş kaydedilen karakter değeri ile null değeri arasında ne fark vardır?

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.

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 );

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.

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.

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.


21 Temmuz 2009 Salı

db2 da kolon bilgilerini (data tipleri, kolon adları, length, scale, null olup olmama durumu) sorgulamak

db2 üzerine aşağıdaki gibi bir sorgu kullanarak kolon bilgilerini sorgulayabilirsiniz. Özellikle dökümantasyon yaparken kullanışlı bir script olacaktır diye düşünüyorum.

Aşağıdaki script ile kolon isimlerini, kolon data tiplerini, uzunluk ve scale, null değer alma bilgilerini select edebilirsiniz.

select
c.colname as "Column Name",
c.typename as "Type Name",
c.length as "Length",
c.scale as "Scale",
c.nulls as "NULL?"
from syscat.columns c
where c.tabname LIKE 'TABLO_ADI'
and tabschema= 'SEMA_ADI';

Sorguyu kendi isteklerinize göre şekillendirmek için select * from syscat.columns; cümlesi ile tüm bilgilere göz atıp istediğiniz filtreyi uygulayabilirsiniz.

Popüler Yayınlar