Monday, November 18, 2013

PL/SQL'de "table of index by" Kullanımı

PL/SQL'de şehirlere göre telefon alan kodlarını saklamak için en uygun veri tipi  table of kullanmak olacaktır:

type t_alan_kodu is table of integer index by varchar2(64);
v_tel_kodu t_alan_kodu;

Daha sonra v_tel_kodu değişkenine tüm illerin alan kodlarını anahtar-değer ikililerini aşağıdaki gibi yerleştirmek gerekir:

v_tel_kodu('ADANA') := 322;
v_tel_kodu('K.MARAŞ') := 344;
v_tel_kodu('ADIYAMAN') := 416; 
v_tel_kodu('KOCAELİ') := 262;
v_tel_kodu('AFYON') := 272;
v_tel_kodu('KONYA') := 332;
v_tel_kodu('AĞRI') := 472; 
v_tel_kodu('KÜTAHYA') := 274;
v_tel_kodu('AKSARAY') := 382;  
v_tel_kodu('MALATYA') := 422;
v_tel_kodu('AMASYA') := 358;
v_tel_kodu('MANİSA') := 236;
v_tel_kodu('ANKARA') := 312;
v_tel_kodu('MARDİN') := 482;
v_tel_kodu('ANTALYA') := 242;  
v_tel_kodu('MUĞLA') := 252;
v_tel_kodu('ARDAHAN') := 478;  
v_tel_kodu('MUŞ') := 436;
v_tel_kodu('ARTVİN') := 466;
v_tel_kodu('NEVŞEHİR') := 384;
v_tel_kodu('AYDIN') := 256;
v_tel_kodu('NİĞDE') := 388;
v_tel_kodu('BALIKESİR') := 266;
v_tel_kodu('ORDU') := 452;
v_tel_kodu('BARTIN') := 378;
v_tel_kodu('OSMANİYE') := 328;
v_tel_kodu('BATMAN') := 488;
v_tel_kodu('RİZE') := 464;
v_tel_kodu('BAYBURT') := 458;  
v_tel_kodu('SAKARYA') := 264;
v_tel_kodu('BİLECİK') := 228;  
v_tel_kodu('SAMSUN') := 362;
v_tel_kodu('BİNGÖL') := 426;
v_tel_kodu('SİİRT') := 484;
v_tel_kodu('BİTLİS') := 434;
v_tel_kodu('SİNOP') := 368;
v_tel_kodu('BOLU') := 374; 
v_tel_kodu('SİVAS') := 346;
v_tel_kodu('BURDUR') := 248;
v_tel_kodu('ŞANLIURFA') := 414;
v_tel_kodu('BURSA') := 224;
v_tel_kodu('ŞIRNAK') := 486;
v_tel_kodu('ÇANAKKALE') := 286;
v_tel_kodu('TEKİRDAĞ') := 282;
v_tel_kodu('ÇANKIRI') := 376;  
v_tel_kodu('TOKAT') := 356;
v_tel_kodu('ÇORUM') := 364;
v_tel_kodu('TRABZON') := 462;
v_tel_kodu('DENİZLİ') := 258;  
v_tel_kodu('TUNCELİ') := 428;
v_tel_kodu('DİYARBAKIR') := 412;  
v_tel_kodu('UŞAK') := 276;
v_tel_kodu('DÜZCE') := 380;
v_tel_kodu('VAN') := 432;
v_tel_kodu('EDİRNE') := 284;
v_tel_kodu('YALOVA') := 226;
v_tel_kodu('ELAZIĞ') := 424;
v_tel_kodu('YOZGAT') := 354;
v_tel_kodu('ERZİNCAN') := 446; 
v_tel_kodu('ZONGULDAK') := 372;
v_tel_kodu('ERZURUM') := 442;  
v_tel_kodu('ESKİŞEHİR') := 222;  
v_tel_kodu('GAZİANTEP') := 342;
v_tel_kodu('GİRESUN') := 454;  
v_tel_kodu('GÜMÜŞHANE') := 456;
v_tel_kodu('HAKKARİ') := 438;  
v_tel_kodu('HATAY') := 326;
v_tel_kodu('IĞDIR') := 476;
v_tel_kodu('ISPARTA') := 246;  
v_tel_kodu('İÇEL') := 324;   
v_tel_kodu('İSTANBUL-AVRUPA') := 212;
v_tel_kodu('İSTANBUL-ANADOLU') := 216;
v_tel_kodu('İZMİR') := 232;  
v_tel_kodu('KARABÜK') := 370;
v_tel_kodu('KARAMAN') := 338;
v_tel_kodu('KARS') := 474;
v_tel_kodu('KASTAMONU') := 366;
v_tel_kodu('KAYSERİ  ') := 352;
v_tel_kodu('KIRIKKALE') := 318;  
v_tel_kodu('KIRKLARELİ') := 288;
v_tel_kodu('KIRŞEHİR') := 386;   
v_tel_kodu('KİLİS') := 348;


İllere göre tüm alan kodları listelenmek istenirsek aşağıdaki kod kullanılabilir:


v_city := v_tel_kodu.first;
for i in 1..v_tel_kodu.count loop
    dbms_output.put_line(v_city || ': ' || v_tel_kodu(v_city));
    v_city := v_tel_kodu.next(v_city);
end loop;

Tuesday, November 12, 2013

PL/SQL'de Sayısal Loto Oynamak

PL/SQL'de sayısal loto için 1-49 aralığında biri birinden farklı 6 rakam çeken ve sıralı olarak konsola yazan kodu aşağıda bulabilirsiniz:
1:  SET serveroutput ON  
2:  DECLARE  
3:  type t_lottery  
4:  IS  
5:   TABLE OF binary_integer;  
6:   v_numbers t_lottery := t_lottery(50,50,50,50,50,50);  
7:   v_candidate binary_integer;  
8:  BEGIN  
9:   FOR i IN 1..6  
10:   LOOP  
11:    DECLARE  
12:     v_found BOOLEAN := false ;  
13:    BEGIN  
14:     LOOP  
15:      v_candidate := ROUND(dbms_random.value(1,49),0);  
16:      v_found := false;  
17:      FOR n IN 1..i  
18:      LOOP  
19:       IF (v_numbers(n)=v_candidate) THEN  
20:        v_found := true ;  
21:       END IF;  
22:      END LOOP;  
23:      EXIT  
24:     WHEN NOT v_found;  
25:     END LOOP;  
26:    END;  
27:    DECLARE  
28:     v_temp v_candidate%type;  
29:    BEGIN  
30:     FOR j IN 1..i  
31:     LOOP  
32:      IF v_numbers(j) > v_candidate THEN  
33:       v_temp := v_candidate;  
34:       v_candidate := v_numbers(j);  
35:       v_numbers(j) := v_temp;  
36:      END IF;  
37:     END LOOP;  
38:    END;  
39:   END LOOP;  
40:   FOR i IN v_numbers.first..v_numbers.last  
41:   LOOP  
42:    dbms_output.put(v_numbers(i) || ' ');  
43:   END LOOP;  
44:   dbms_output.new_line;  
45:  END;  

Örnek konsol çıktıları aşağıda verilmiştir:

anonymous block completed
12 19 29 35 38 43

anonymous block completed
15 19 22 27 39 44

anonymous block completed
17 19 21 26 30 39

anonymous block completed
9 12 25 31 32 44

anonymous block completed
19 21 27 38 44 47