Firebird Store procedure le Bul ve Değiştir
#1
Merhaba , Artık eskisi gibi programlamayla uğraşamıyorum. Arada sırada ufak tefek ihtiyaçları karşılamak için kod yazıyorum o kadar. Kod yazmak çok zevkli bir iş ama hagi işi yaparsanız yapın işinize ilerledikçe eninde sonunda işletmeci-idareci oluyorsunuz. her şeyi idare ediyoruz yani. Bende baya uzak kalmışım bu alemdenki iki satır kod için baya uğraştım. Yeni mezun yazılımcı arkadaşlara tavsiyem eğer işinizi severk yapıyorsanız kendinize iyi bir iş bulun kodlaınızı yazın kalanına karşmayın tabi günümüz şartlarında bu baya zor. İş akışı sizi yapmaktan hoşalandığınız kod yazma yerine okuldan mezun olduğunuzda angraya olarak gördüğünüz işlere sürüklüyor. Her halanda böyle mesela doktor olasınız eninde sonunda baş hekim yapıyorlar doktorluk yerine hastane müdürü oluveriyorsunuz Smile
Elime 3 milon dan fazla bir mail bankası geçti, dedim şunu bi temizliyim. Db ye aldım. Unic indexle bir sürü chek kontrolü ile filan geçersiz mailleri baya ayıkladım ama yetmedi. çünkü kayıtlarda ç,ş,ü, gibi kareketerler kullanılmış olacak şey değil ama oluyor. Bunları temizlemenin iki yöntemi var biri dbyi txt olarak export edip bi stajer bulup bu angraya işi notepat++ la bul değiştir yaptırmak. diğer veri tabanının bul değiştir fonksiyonunu kullanarak bu işlemi firebirde yaptırmak. Her halukarda işlem uzun sürüyor, çünkü veri çok. Neyse ben sql i seçtim ama işin başında deyim notepat++ kesin daha hızlı bitirirdi bu işi. Çünkü kod yazmasıydı filandı feşamdı derken 30 dk geçiveriyor. birde unic index e takıldı hata verdi. Ama ben noSql e yes diyemeyen antika programcı familyasıdayım.
Sadede gelmek gerekirse
Emails tablsunda Emails_email alanındaki verilerde bul ve değitir işlemi yapan store procedure yi kod olarak ekliyorum.
mesela veri tabanında İ kullanıldıyasa onu i olarak değiştiriyorum.
bunun için cursor kullanıyorum
bu fonksiyon için firebird 2.1üstü kullanmanız gerekmekte.

Kod:
SET TERM ^ ;
create PROCEDURE DEGISTIR2
AS
DECLARE VARIABLE sayac INTEGER ;    
DECLARE VARIABLE    EMAILS varchar(60);
DECLARE VARIABLE     KAYIT_SAYISI integer ;
declare cur cursor for
  (select EMAILS_EMAIL  from EMAILS);
begin
  sayac = 0;
  select count(*)  from EMAILS into :kayit_sayisi  ;

  
  open cur;
  while (:kayit_sayisi>sayac) do
  begin
   sayac = sayac +1 ;
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ü', 'u');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ü', 'u');  
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ğ', 'g');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ğ', 'g');  
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'İ', 'i');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'I', 'i');  
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ş', 's');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ş', 's');      
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ç', 'c');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ç', 'c');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ö', 'o');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ö', 'o');  
      
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, ' ', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'www', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'WWW', '');      
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '!', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '#', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '~', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, ':', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '?', '');
   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '$', '');
  
  
  
  
  
  
    if (row_count = 0) then leave;
    suspend;
  end
  close cur;



  

end^
SET TERM ; ^


GRANT EXECUTE
ON PROCEDURE DEGISTIR2 TO  SYSDBA;


Kod:
CREATE TABLE EMAILS
(
  EMAILS_OTO integer NOT NULL,
  EMAILS_EMAIL varchar(50) COLLATE PXW_TURK,
  EMAILS_NOT varchar(10) COLLATE PXW_TURK,
  CONSTRAINT PK_EMAILS_0 PRIMARY KEY (EMAILS_OTO)
);

umarım bir gün birilerinin işine yarar Smile



  Alıntı
Bu mesajı beğenenler:
#2
(10-10-2012, 12:15)AhmetNuri demiş ki: Merhaba , Artık eskisi gibi programlamayla uğraşamıyorum. Arada sırada ufak tefek ihtiyaçları karşılamak için kod yazıyorum o kadar. Kod yazmak çok zevkli bir iş ama hagi işi yaparsanız yapın işinize ilerledikçe eninde sonunda işletmeci-idareci oluyorsunuz. her şeyi idare ediyoruz yani. Bende baya uzak kalmışım bu alemdenki iki satır kod için baya uğraştım. Yeni mezun yazılımcı arkadaşlara tavsiyem eğer işinizi severk yapıyorsanız kendinize iyi bir iş bulun kodlaınızı yazın kalanına karşmayın tabi günümüz şartlarında bu baya zor. İş akışı sizi yapmaktan hoşalandığınız kod yazma yerine okuldan mezun olduğunuzda angraya olarak gördüğünüz işlere sürüklüyor. Her halanda böyle mesela doktor olasınız eninde sonunda baş hekim yapıyorlar doktorluk yerine hastane müdürü oluveriyorsunuz Smile
Elime 3 milon dan fazla bir mail bankası geçti, dedim şunu bi temizliyim. Db ye aldım. Unic indexle bir sürü chek kontrolü ile filan geçersiz mailleri baya ayıkladım ama yetmedi. çünkü kayıtlarda ç,ş,ü, gibi kareketerler kullanılmış olacak şey değil ama oluyor. Bunları temizlemenin iki yöntemi var biri dbyi txt olarak export edip bi stajer bulup bu angraya işi notepat++ la bul değiştir yaptırmak. diğer veri tabanının bul değiştir fonksiyonunu kullanarak bu işlemi firebirde yaptırmak. Her halukarda işlem uzun sürüyor, çünkü veri çok. Neyse ben sql i seçtim ama işin başında deyim notepat++ kesin daha hızlı bitirirdi bu işi. Çünkü kod yazmasıydı filandı feşamdı derken 30 dk geçiveriyor.  birde unic index e takıldı hata verdi. Ama ben noSql e yes diyemeyen antika programcı familyasıdayım.
Sadede gelmek gerekirse
Emails tablsunda Emails_email alanındaki verilerde bul ve değitir işlemi yapan store procedure yi kod olarak ekliyorum.
mesela veri tabanında İ kullanıldıyasa onu i olarak değiştiriyorum.
bunun için cursor kullanıyorum
bu fonksiyon için  firebird 2.1üstü kullanmanız gerekmekte.

Visual Basic
  1. SET TERM ^ ;
  2. create PROCEDURE DEGISTIR2
  3. AS
  4. DECLARE VARIABLE sayac INTEGER ;    
  5. DECLARE VARIABLE    EMAILS varchar(60);
  6. DECLARE VARIABLE     KAYIT_SAYISI integer ;
  7. declare cur cursor for
  8.  (select EMAILS_EMAIL  from EMAILS);
  9. begin
  10.  sayac = 0;
  11.  select count(*)  from EMAILS into :kayit_sayisi  ;
  12.  
  13.  
  14.  open cur;
  15.  while (:kayit_sayisi>sayac) do
  16.  begin
  17.   sayac = sayac +1 ;
  18.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ü', 'u');
  19.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ü', 'u');  
  20.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ğ', 'g');
  21.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ğ', 'g');  
  22.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'İ', 'i');
  23.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'I', 'i');  
  24.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ş', 's');
  25.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ş', 's');      
  26.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ç', 'c');
  27.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ç', 'c');
  28.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'Ö', 'o');
  29.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'ö', 'o');  
  30.      
  31.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, ' ', '');
  32.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'www', '');
  33.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, 'WWW', '');      
  34.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '!', '');
  35.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '#', '');
  36.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '~', '');
  37.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, ':', '');
  38.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '?', '');
  39.   update EMAILS r set r.EMAILS_EMAIL = replace(r.EMAILS_EMAIL, '$', '');
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.    if (row_count = 0) then leave;
  47.    suspend;
  48.  end
  49.  close cur;
  50.  
  51.  
  52.  
  53.  
  54.  
  55. end^
  56. SET TERM ; ^
  57.  
  58.  
  59. GRANT EXECUTE
  60. ON PROCEDURE DEGISTIR2 TO  SYSDBA;




Visual Basic
  1. CREATE TABLE EMAILS
  2. (
  3.  EMAILS_OTO integer NOT NULL,
  4.  EMAILS_EMAIL varchar(50) COLLATE PXW_TURK,
  5.  EMAILS_NOT varchar(10) COLLATE PXW_TURK,
  6.  CONSTRAINT PK_EMAILS_0 PRIMARY KEY (EMAILS_OTO)
  7. );



umarım bir gün birilerinin işine yarar Smile

Benim işime bayağı yaradı .
Şu Veritabnının sihirli cümleleri olmasa benim de elimdeki maillere ait yanlış girilmiş büyük küçük harf düzeltmeleri çok uğraştıracaktı.
Birgün gelir başkasının işine de yarar böyle paylaşımlar.
Eliniz dert görmesin, Teşekkürler.



  Alıntı
Bu mesajı beğenenler:
#3
Update cümlesine where şartı eklemediğiniz için her kayıt için tüm tabloyu güncellemeye çalıştığından süre çok uzayacaktır.


Visual Basic
  1. Where Current Of cur;




ekleyerek yalnız cursor'un geçerli kaydını güncellersiniz...



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  Firebird : Kurulum ve Connection Zeki Gürsoy 9 15.279 21-04-2021, 15:13
Son Mesaj: sarsak
access-sql-14 Firebird : Yürüyen Bakiye Uygulaması Zeki Gürsoy 16 13.935 12-08-2015, 14:12
Son Mesaj: akuyumcu63
  Firebird Aynı Kayıtları bul ve sil AhmetNuri 0 2.932 12-10-2012, 20:52
Son Mesaj: AhmetNuri
  firebird ile listelenmiş verinin kaynak tablosunu değiştirme yardım! muratxx5 1 2.422 21-05-2012, 00:05
Son Mesaj: Zeki Gürsoy
  Firebird otmatik loglama (Trigger Level Loging) AhmetNuri 6 8.129 26-03-2012, 01:31
Son Mesaj: Zeki Gürsoy
  Firebird Veritabanında olan procedure lar nasıl gizlenir softdestek 8 6.101 19-03-2012, 21:40
Son Mesaj: softdestek
  Firebird : DateDiff (Excel ETARİHLİ fonk. birebir kopyası) Zeki Gürsoy 0 3.938 21-02-2012, 02:58
Son Mesaj: Zeki Gürsoy
  Trigger dan Firebird veri tabanı kullanıcısı ekleme silme ve gücelleme AhmetNuri 7 8.305 12-01-2012, 22:25
Son Mesaj: Zeki Gürsoy

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi