Birden cok satiri bir INSERT bildirimi ile yazma

INSERT ALL
  INTO mytable (column1, column2, column3) VALUES ('val1.1', 'val1.2', 'val1.3')
  INTO mytable (column1, column2, column3) VALUES ('val2.1', 'val2.2', 'val2.3')
  INTO mytable (column1, column2, column3) VALUES ('val3.1', 'val3.2', 'val3.3')
SELECT * FROM dual;

En cok rastlanan ORA hata kodlari-1

ORA-00918: column ambiguously defined

Kosturulan sorguda SELECT ile tablolardan istenen sutun isimlerinin benzersiz olmasi gerekmektedir. Ayni sutun ismi birden cok tabloda kullanilmis olabilir. Ayni isimli sutunlari olan tablolar SELECT * sorgusunda JOIN veya INNER Select ile baglandiginda bu hata ile karsilasilir. SELECT * ile tum tablolarin tum sutunlarini secmek yerine hangi tablodan hangi sutunu istediginiz ayri ayri yazmak ve sorgu icinde sutunlari column alias ile gostermek hatayi giderecektir.

Oracle column alias in nasil yapildigina ornek verecek olursak;

# column_name AS alias_name
SQL> create table t1( t1_id number primary key, col1 integer ) organization index;

Table created.

SQL> create table t2( t2_id number primary key, id number ) organization index;

Table created.

SQL> --// code works 
SQL> select t1_id, t2_id, col1 from t1, t2 where t1_id = id;

no rows selected

SQL> --// data changes, scope impacted
SQL> alter table t2 add (col1 varchar2(10));

Table altered.

SQL> --// same code no longer works
SQL> select t1_id, t2_id, col1 from t1, t2 where t1_id = id;
select t1_id, t2_id, col1 from t1, t2 where t1_id = id
                     *
ERROR at line 1:
ORA-00918: column ambiguously defined

Oracle PL/SQL: LEFT (OUTER) JOIN ornek kullanimi

Oracle PL/SQL: OUTER JOIN Ne zaman kullanilir?

Bir onceki yazimizda Inner Join'den bahsetmistik. Left Outer Join veya Left Join ile devam edelim. Bu join tipi sol tarafta verilen tablodaki tum satırları getirirken sag tarafta kalan tablo icin sadece JOIN kosulunu saglayanları getirir. Ornekle somutlastırırsak eger; Araba ve bisiklet kiralama yapan bir sirketin siparis takip programinda cars, customers, bikes ve rentals isimli 4 adet tablo bulunmakta...Rentals tablosu musterinin hangi demirbasi ne zaman kiraladıgını gosteren bir gecmisi, digerleri de musteri ve envanter detaylarını tutan tablolardir.

id license_plate purchase_date
100 34ZA700 06/06/2000
101 34ET800 10/06/2000
id name
10 Ali
11 Veli
12 Recep
id car_id bike_id customer_id rental_date
1 100   10 07/08/2000
2   202 10 08/09/2000

 

SELECT * FROM customers
INNER JOIN rentals on (rentals.customer_id = customers.customer_id) 
LEFT JOIN cars on (car_id = rentals.car_id)
WHERE customers.customer_id = 10

Ilk once INNER JOIN ile customers ve rentals tablolari birbirine baglanarak kesisim kumesi alinmistir. Yani customer_id 10 icin customers ve rentals tablosundaki ortak satirlar getirilmistir. Asagidaki tabloda goruldugu uzere tum satirlar istendigi icin soldan saga sirasiyla customers ve rentals tablolarinin satirlari siralanmistir. Eger customer_id 10 icin hem arac hem de bisiklet kiralama gecmisini getirmek isteseydik INNER JOIN ile bunu yapamazdik.

id name id CAR_ID bike_id customer_id rental_date car_id license_plate purchase_date
10 Ali 2 - 202 10 08/09/2000 - - -
10 Ali 1 100 - 10 07/08/2000 100 34ET700 06/06/2000
10 Ali 1 100 - 10 07/08/2000 101 34ET800 10/06/2000

Oracle PL/SQL: INNER JOIN ornek kullanimi

Oracle PL/SQL: INNER JOIN

Oracle PLSQL de JOIN birden cok tablodan, yurutelecek bir SQL komutu ile veri cekmek icin kullanılır. Bir tek SQL sorgusu ile iki veya daha fazla sayida tablo mantiksal olarak birlestirilerek istenilen kosulu saglayan satirlar getirilir.

INNER JOIN

En sik kullanilan JOIN tipi olarak bunu soyleyebiliriz.  Birden cok tablodan istenilen kosulu saglayan tum satirlari sorgu sonucunda verir. INNER JOIN iki kumenin kesisim bolgesindeki elemanlarin hepsini getirir diyebiliriz.Kesisim bolgesinin sinirlarini da SQL deki kosul belirler. Ornekle aciklamak icin salespeople ve sales isimli iki tane tablomuz olsun:

Person_id LastName FirstName
10000 Ali Yazar
10001 Veli Bozar
10002 Satilmis Dursun
10003 Orhan Gutan
Order_id SalesPerson_id order_date
500125 10000 2003/05/12
500126 10001 2003/05/13
500127 10004 2003/05/14

INNER JOIN kullanan Oracle SELECT sorgusunu  :

SELECT salespeople.LastName, salespeople.FirstName, sales.order_date
FROM salespeople
INNER JOIN sales
ON salespeople.Person_id = orders.SalesPerson_id;

Bu sorgunun cevabi :

LastName Firstname order_date
Ali Yazar 2003/05/12
Veli Bozar 2003/05/13

Eger sorguyu asagidaki gibi yurutsek

SELECT * FROM salespeople
INNER JOIN sales
ON salespeople.Person_id = orders.SalesPerson_id;

Ciktisi soyle olacakti

PERSON_IDLASTNAMEFIRSTNAMEORDER_IDSALESPERSON_IDORDER_DATE
10001BozarVeli5001261000105/13/2003
10000YazarAli5001251000005/12/2003

İki tablonun satirlarini karsilastirdigimizda; 1002 ve 1003 id li kisiler  icin sales tablosunda sales order kaydı bulunmamaktadir. Salesperson tablosunda da 1004 id kisi icin kayit bulunmamaktadir. 1004 id li satis temsilcisi isten ayrilmis ve kaydi silinmis olabilir. Bu durumda her iki tablodaki ortak person id icin bulunan kayitlardan select de verilen sutunlar sonuc olarak getirilmis olur.

Oracle Kavramlari - Indeks

Oracle Veritabanında indeksleri anlamak

İsin abc sinden baslarsak once blok kavramina kisaca bakalim. Sabit disk uzerinde Oracle in yazma okuma yapabilecegi en kucuk alan olup tum Oracle veritabanı nesneleri( tablo, indeks, cluster vb) bloklar uzerinde saklanirlar. Blok buyuklugu her veritabani icin yapilandirilabilir olmakla beraber genelde 4,8,16 veya 32kb degerlerinden birini alir. Veritabanlarinda bir satirin tum sutunlarin istisnalar haric tuttugu alan genelde bir blok alanından buyuk olamayacagi icin bir tek blok icine tablonun bircok satiri sigar. Oracle bu yuzden hicbir zaman sadece bir satiri okuyamaz, en azindan bir blogu okur, aradigi satiri bulur ve digerlerini ihmal eder. Oracle indeksleri genel olarak iki mimari uzerine kurulmustur : b-Tree ve bitmap. Bildigimiz tum diger indeks tipleri bu iki mimari uzerine kurulmustur. Bitmap indekslere daha sonra donmek uzere simdi b-Tree indekslerin detayına girelim.

Agac formunda bir veri yapisi olan b-Tree tipi indeks , veritabanı bloklarından olusan bir agactir. Bu indeks agacinin dallarinin ucundaki her yaprakta bloklar bulunmaktadir. Simdi bir telefon fihristini dusunerek Balanced tree kavramini somutlastiralim. Bu agacin dallarinin ucundaki her blok fihristin bir sayfasidir. Her sayfada bir den isim, telefon ve adres bilgisi bulunur tipki blogun birden cok satir icermesi gibi. Isim, address ve telefondan olusan bu satirdaki isim aradigimiz indekslenmis sutun degerine tekabul edip kisinin bulundugu yer olan adresi de ROWID dir. Fihristin her sayfasindaki isimler alfabetik olarak yukaridan asagiya siralanmislardir. Fihristte D ile baslayan kisilerin bulundugu sayfaya ayirac yardimiyla gideriz ve yukaridan asagiya tarayarak ornegin Demir isimili kisinin iletisim bilgilerini ulasiriz. Bu siralama sayesinde tum sayfayi bastan sona okumadan bastaki isimlerin yani indekslenmis sutunlarin alfabetik siralanmasindan yararlanarak hizlica aradigimiz ismi buluruz. Ama veritabani burada bizim yaptigimiz gibi satiri okuyamayaz, D ile baslayan kisilerin bulundugu tum sayfayi yani blogu okumak durumundadir.

Eger fihristte ayirac olmasaydi soyle bir sayfa olmak zorundaydi: Her sayfanin basindaki yani ilk satirindaki isim ve bunun bulundugu sayfa. Sayfa 3- Adem Sayfa 7- Bahri Sayfa 25-Cem gibi. Iste bu sayfa B-Tree deki dallarda bulunan bloklara tekabul etmektedir. Dal blogu icinde bir blok adresi ve o adresteki blogun ilk basindaki satirin bilgileri bulunmaktadir. Yeni veri geldikce dal bloguna bagli baska bir dal blogunun acilmasi sadece satir degerlerinin olusacak yaprak bloguna kadar devam eder.

B-Tree yapisindaki fihristte Galip ismini bulunmasi
  • Sayfa 1: Dal Blogu(isim ve bu isimle baslayan sayfanin numarasi ) : (Sayfa 6 Ferit) , (Sayfa 7 Hayri)
  • Sayfa 3: Dal Blogu(isim ve bu isimle baslayan sayfanin numarasi ) : (Sayfa 300 Furkat) , (Sayfa 301 Gaye)
  • Sayfa 300: Galip isminin bulundugu yaprak Blogudur. Aydin ismi icin gidilecek baska bir dal blogu yoktur.

Oracle da indeksleri cesitli saklama ayarlari ve yerlesecegi tablespace i vererek(explicitly) veya vermeyerek tanımlayabiliriz. Eger bu parametreler verilmeden yaratilirlarsa varsayilan saklama secenekleri kullanilarak ve varsayilan tablespace uzerinde yaratilirlar. Essiz indeksler birincil anahtar kisiti ile iliskilendirilen sutun veya sutunlarda ayni degeri tasiyan iki satirin olmamasını garanti ederler. Aksine essiz olmayan indeksler de satir essizligini sunmazlar. Oracle veritabani tablo uzerindeki UNIQUE veya PRIMARY KEY tutarlilik kısıtlarinin tanımlanması durumunda her biri icin essiz bir indeks yaratir. Tablonun sutun veya sutunlari icin daha onceden tanimlanmis UNIQUE kisitini gecici olarak gecersiz kilmak ve daha sonra kaldirilmasindan bu yana girilen satirlardaki sutunlar icin essizligini kontrol etmeden UNIQUE kisitini tekrar devreye almak istiyorsak kullanilmasi gereken indeks tipi essiz olmayan olmalidir.

Aslinda Oracle indekslenmis herhangi satirin yerini bulabilmesi icin her durumda essiz olmayan indeksleri essiz indekslere cevirmektedir. Satirin ROWID isi indeks satir kayıdına ek bir sutun olarak eklenerek essiz olmayan indeks arkaplanda essiz hale getirilmis olur. Boylece indeks yapisi icinde uygun sirada ve pozisyonda indeksi saklamak icin gereken essiz indeks satir kaydi olusturulmus olur. Eger satirin sutununa gireceginiz verinin essiz olmasi gerekiyorsa bu sutun icin UNIQUE kisitini tanimlayin , Oracle sizin icin indeksi yaratacak ve caresine bakacaktir. Eger kisitinizi NOT DEFERRABLE olarak yarattıysanız Oracle in yaratacagi indeks essiz aksi durumda zaten essiz olmayan tipte olacaktir.

MySQL-JDBC: Communications Link Failure

Cannot connect to database server
Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

Mysql sunucusunda JDBC uzerinden erismeye calistiginizda eger yukaridaki exception i aliyorsaniz, ayni veya uzak sunucu uzerinde calisan MySQL sunucusuna erisim ile ilgili genel bir probleminiz var diyebiliriz. Bu problemin sebebi eristiginiz MySQL sunucunun yapilandirilmasi, JDBC baglantisi icin cagirdiginiz DriverManager.getConnection(url, userName, password) fonksiyonun parametreleri veya aranızdaki IP elemanları ile ilgilidir. Bu hata mesajinin giderilmesi icin izlenebilecek cozum yollarindan bazilarini listelersek;

"bind-address"

Yeni kurulan MySQL sunucusunda varsayilan "bind-address" degeri guvenlik gerekcesi ile yerel loopback adresi olan 127.0.0.1 olarak atanmistir. Eger /etc/mysql/my.conf dosyasinizda bind-address = 127.0.0.1 olarak goruyorsaniz bu MySQL sunucusuna sadece bu sunucu uzerinde kosan uygulamanizla baglanabilirsiniz. Bu satirin basina # koyarak sunucu baslatilirken gozardi edilmesini saglayin.

# bind-address = 127.0.0.1  # gozardi edin

Bu sayede MySQL in uzak sunuclarin IP4 Ip ve port adresleri ile baglanmalarina eger kullaniciniya geldigi IP icin yetki verilmisse izin verecektir. Eger sunucunun sabit IP adresi var ise yerel loopback adresini yerine onu yazmak da cozum olacaktir. Ayrica baglanmaya calistiginiz kullanicinin geldigi IP adresinden MySQL sunucuya erisim yetkisi verilip verilmedigine de bakmak iyi olacaktir.

$ sudo mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO alice@'%' IDENTIFIED BY “alice_password”;
Burada user@xx.xxx.xx.xx icin 2 secenek mumkun.

1. user@% . kullanicinin hangi IP den geldigine bakmaksizin erisim icin yetkilendirilecektir.
2. user@192.168.0.% Eger DHCP den dinamik IP adresi aliyorsaniz default gateway IP adresinden alacaginiz ilk 3 blokla dinamik IP adresinizle baglanabilirsiniz.

"skip-networking"

Eger bu yapilandirma satiri /etc/mysql/my.conf dosyasinda gozardi edilmemis olarak duruyorsa , mysql sunucusunun TCP/IP baglantisi uzerinden gelen baglanti isteklerini dinlemesi tamamen kapatilmis demektir. Bu durumda sadece pipe,shared memory ve socket uzerinden sunucu ile istemci uygulamalar baglanti kurabilir. Sadece yerel agdan olacak baglantilar icin kullanilmalidir.Bu yapilandirma ayarini sadece yerel agdan ve belirtilen yontemlerle baglantı salanacaksa kullanin. Aksti takdirde # ile gozardi edildiginden emin olun.

SyntaxHighlighter nasil kullanilir?

Blog yazmak icin google tarafindan sunulan blooger.com u kullanan yazilimci arkadaslar dahili olarak kod blogunu o programlama dilinin soz dizimine gore renklendirip bicimleyen editor desteginin olmadigini fark etmislerdir. Alex Gorbatchev tarafindan gelistirilen SyntaxHighlighter javascript kutuphanesi yardimiyla cesitli yazilim dilleri icin kod blogunu html icinde renklendirip formatli olarak sunmak mumkun.

SyntaxHighligther javascript ve css dosylarini blogger template icinde </head> etiketinden hemen once ekleyin ve kaydedin. ilgilenmediginiz diller icin gereken javascript dosyalarini isterseniz eklemeyebilirsiniz. Artik daha once yazdiginiz ve yeni yazacaginiz blog post lari icin SyntaxHighligther i Script etiketi ile asagida verilen ornek gibi kullanmaya baslayabilirsiniz.

Eger Your HTML cannot be accepted: Closing tag has no matching opening tag: SCRIPT Dismiss hatasini aliyorsaniz html escaped karakterleri kullanmalisiniz. Quick escape i kullanarak hata veren kod blogunu escaped html e cevirip tekrar yapistirdiginizda hata duzelecektir.