Mysql veritabanında Stored Procedures kullanarak toplu insert işlemi

Toplu veri girişi yapmak bazen gerekli olabiliyor. Mesela binlerce 'jpg' uzantılı resmi kendi sunucunuza upload edip bu resimlerin 'resimler/1.jpg' gibi sunucudaki adres bilgilerini veritabanına girmek istediğinizde toplu insert işlemi yapmak isteyebilirsiniz. Bu durumda Stored Procedures kullanmak daha mantıklı olabilir.

Stored Procedures yazmadan önce ilk başta resimlerin bilgilerini gireceğimiz tabloyu Mysql veritabanı programında oluşturalım.

Tabloyu oluşturacak sql kodu:

--
-- Tablo yapısı: `image_src`
--

CREATE TABLE IF NOT EXISTS `image_src` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(15) NOT NULL,
  `source` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

Yukarıdaki tabloya sırasıyla id (resim kimlik numarası) , category (resmin kategorisi) ve source (resmin bulunduğu yerin adres) bilgilerini gireceğiz.

Resimlerin sunucumuzda nasıl isimlendirildiğine ve yerleştirildiğine bakalım:

resimlerin isimleri

Eğer resimleri teker teker 1, 2, 3 ... şeklinde isimlendirmekle uğraşmak istemiyorsanız bunun yerine dosyaları otomatik olarak isimlendiren ücretli veya ücretsiz File Renamer gibi programlar kullanabilirsiniz

Şimdi istediğimiz kadar insert işlemi yapabilien bir Stored Procedures yazalım. Procedure yazarken resimlerin başlangıç bir bitiş numarasını ve resimlerin kategori bilgisini parametre olarak almasını sağlayalım ki düzenli bir toplu insert işlemi yapalım :

 DELIMITER //
CREATE PROCEDURE `src_insert`(IN strt INTEGER(11) , IN nd INTEGER(11), IN ctgry VARCHAR(15) )
BEGIN
  WHILE strt < nd DO
     INSERT INTO image_src(id,category,source) VALUES  ('NEW.id',ctgry ,CONCAT(ctgry ,'/' , strt ,'.jpg'));
     SET strt = strt + 1;
  END WHILE;
  END //
 DELIMITER ;
Not: Mysql istemcisinde Trigger veya Stored Procedures yaratmaya kalkışınca hata alacaksınız. Noktalı virguller (;) komut bitiminde kullanılır fakat noktalı virgül kullandıktan sonra Procedure veya Trigger devam ettiğinden Mysql hata verir. Bunu engellemek için DELIMETER komutu ile ayraç kullanmamız gerekir.

Yazdığımız procedure 3 adet parametre alıyor. Bu paramatreler sırayla; strt girilecek resmin başlangıç numarası, nd girilecek son resmin numarası ctgry ise resimlerin kategorisini temsil edecek.

CONCAT(ctgry ,'/' , strt ,'.jpg') bize kategori ismine göre bir adres yaratır. CONCAT komutu girilen karakter katarlarını birleştirmeye yarar. Mesela kategori olarak 'hayvanlar' seçtiysek bu komut 'hayvanlar/1.jpg' sonucunu döndürür.

While Loop ile girilien başlangıç ve bitiş numarınlarına göre bir kontrol yarattık. Bu sayede istenilen bir sayıdan insert yapmaya ve istediğimiz bir sayıda sonlandırmayı sağladık. While döngüsü bize toplu insert işlemi yapmamıza olanak sağlıyor.

'src_insert' adlı procedure olşturduktan sonra CALL komutu ile yazdığımız procedure'u çalıştıralım.(1'den 10'a kadar 'hayvanlar' kategorisinde insert işlemi yapacak şekilde insert işlemi yapar) :

 CALL src_insert(1,10,'hayvanlar')     

Yukarıdaki komutu çaluştırınca çıkan sonuç: ( 1'den 10'a kadar sırayla source alanına resimlerin adresleri giriliyor. )

procedure çağrıldıktan sonra

Sunucunuzun html_public klasörü içindeki 'hayvanlar' klasörüne doğru isimlendirdiğiniz resimleri yerleştirdiyseniz  'image_src' tablosundan bilgileri çekilerek sırayla resimlerin adreslerini artık alıp istediğimiz gibi kullanabiliriz.

Stored Procedures ile daha fazla bilgiye ulaşmak için buraya tıklayın.

Umarım yazım faydalı olmuştur.

yazan Zülküf Küçüközer tarih   13th August 2009
primary key words  Mysql | Stored procedures | Veritabanı | Toplu insert okunma  7554
secondary key words  Toplu veri girişi
writing Orhan writing 21st April 2011
Merhaba ben kodlamada yenıyım ..Bu yontem mesela bir uye sayfasında ueynın 20 adet resım ekleme bolumu olan bı sayfa içinde gecerlimi?