4 Ocak 2011 Salı

Sayısal Loto PL/SQL Paketi

Merhabalar,


Anar Qocayev için ufak bir PL/SQL örneği hazırladım. Bu PL/SQL paketinin amacı verilen 6 adet sayının ne zaman tutacağını söylemesi (kısaca). Örnek PL/SQL bloğu içerisinde birçok farklı noktalara ait örnekler bulunuyor. Umarım işinize yarar. Gerçi biraz eski, yanılmıyorsam 2007'den kalma :)



Package Spec

CREATE OR REPLACE package sayisal_loto_paketi is
    procedure loto_oyna;
    procedure loto_kayitlari_goster;
    procedure loto_karsilastir(loto_degeri varchar2);
end;
/




Package Body



CREATE OR REPLACE package body sayisal_loto_paketi is
    procedure loto_oyna is
        type LotoArray
        is table of number
        index by pls_integer;
      
        textfile utl_file.file_type;
      
        Loto LotoArray;
        index_den number default 0;
        temp number default 0;
        array_den varchar(100);
      
    begin
  
        textfile := utl_file.fopen(upper('lotodirectory'),'loto_kayit.txt','a',32767);
      
        if not utl_file.IS_OPEN(textfile) then
            dbms_output.put_line('Textfile acilamadi');
         end if;
  
        for i in 1..6
        loop
            Loto(i) := trunc(dbms_random.VALUE(1,50));
        end loop;
      
        for i in 1..6
        loop
            index_den := index_den + 1;
            for f in 1..6
            loop
                if (Loto(index_den) = Loto(f) AND index_den <> f) then
                    Loto(f) := trunc(dbms_random.VALUE(1,50));
                end if;
            end loop;
        end loop;
      
        dbms_output.put_line('Rastgele siralanmis rakamlar: ');
        dbms_output.put_line(Loto(1)||' - '||Loto(2)||' - '||Loto(3)||' - '||Loto(4)||' - '||Loto(5)||' - '||Loto(6));
      
        for i in 1..6
        loop
            for j in reverse 1..5
            loop
                if (Loto(j)>Loto(j+1)) then
                    temp := Loto(j);
                    Loto(j) := Loto(j+1);
                    Loto(j+1) := temp;
                end if;
            end loop;
        end loop;
      
        dbms_output.put_line('Kucukten buyuge siralanmis rakamlar: ');
        dbms_output.put_line(Loto(1)||' - '||Loto(2)||' - '||Loto(3)||' - '||Loto(4)||' - '||Loto(5)||' - '||Loto(6));
        dbms_output.put_line(' ');
      
        array_den := (Loto(1)||' - '||Loto(2)||' - '||Loto(3)||' - '||Loto(4)||' - '||Loto(5)||' - '||Loto(6));
      
        utl_file.PUT_LINE(textfile,array_den);
        insert into loto_loglar
        values(array_den);
        dbms_output.put_line('c:\utl_loto klasoru altinda "loto_kayit.txt" dosyasina ve loto_loglar tablosuna loto sonucunuz kaydedilmistir!');
        dbms_output.put_line('sayisal_loto_paketi(slp) altinda loto_kayitlari_goster procedurunu cagirarak kayitlari gorebilirsiniz!');
        dbms_output.put_line('--------------------------- ');
      
        utl_file.FCLOSE_ALL;
        exception
        when others then
            dbms_output.put_line(SQLERRM);
    end;
    procedure loto_kayitlari_goster is
        textfile utl_file.file_type;
        array_den varchar2(32767);
    begin
  
        textfile := utl_file.fopen(upper('lotodirectory'),'loto_kayit.txt','r',32767);
        if not utl_file.is_open(textfile) then
            dbms_output.put_line('Dosya acilamadi!');
        end if;
  
        loop
            utl_file.get_line(textfile,array_den);
            dbms_output.put_line(array_den);
        end loop;
  
        utl_file.fclose_all;
  
        exception
        when no_data_found then
            utl_file.fclose(textfile);
        when others then
            dbms_output.put_line(SQLERRM);
 
    end;
    procedure loto_karsilastir(loto_degeri varchar2) is
  
    yanlis_deger exception;
    pragma exception_init(yanlis_deger,-20100);
    dogru exception;
    pragma exception_init(dogru,-20099);
  
    type Lotoarray
    is table of number
    index by pls_integer;
  
    textfile_deneme utl_file.file_type;
    textfile_deneme1 utl_file.file_type;
  
    arrayden Lotoarray;
    arrayden_karsilastir Lotoarray;
    sayi number default 0;
    temp number default 0;
    temp1 number default 0;
    dongu number default 0;
    deneme varchar2(50);
    deneme1 varchar2(50);
    begin
        textfile_deneme := utl_file.fopen(upper('lotodirectory'),'karsilastir.txt','w',32767);
      
        if not utl_file.IS_OPEN(textfile_deneme) then
            dbms_output.put_line('Text dosyasi acilamadi!');
        end if;
      
        utl_file.PUT_LINE(textfile_deneme,loto_degeri);
      
        utl_file.FCLOSE(textfile_deneme);
      
        if not (length(loto_degeri) BETWEEN 11 AND 17) then
            raise yanlis_deger;
        end if;
      
            for i in 1..6
            loop
                arrayden(i) := trunc(dbms_random.VALUE(1,50));
            end loop;

            for i in 1..6
            loop
                sayi := sayi + 1;
                for f in 1..6
                loop
                if (arrayden(sayi) = arrayden(f) AND sayi <> f) then
                    arrayden(f) := trunc(dbms_random.VALUE(1,50));
                end if;
                end loop;
            end loop;
      
            for i in 1..6
            loop
                for j in reverse 1..5
                loop
                if (arrayden(j)>arrayden(j+1)) then
                    temp := arrayden(j);
                    arrayden(j) := arrayden(j+1);
                    arrayden(j+1) := temp;
                end if;
                end loop;
            end loop;
      
        deneme1:= (arrayden(1)||' '||arrayden(2)||' '||arrayden(3)||' '||arrayden(4)||' '||arrayden(5)||' '||arrayden(6));
      
        textfile_deneme1 := utl_file.fopen(upper('lotodirectory'),'karsilastir_deneme.txt','w',32767);
      
        if not utl_file.IS_OPEN(textfile_deneme1) then
            dbms_output.put_line('Text dosyasi acilamadi!');
        end if;
      
        utl_file.PUT_LINE(textfile_deneme1,deneme1);
      
        utl_file.FCLOSE(textfile_deneme1);
      
        textfile_deneme := utl_file.fopen(upper('lotodirectory'),'karsilastir.txt','r',32767);
      
        if not utl_file.IS_OPEN(textfile_deneme) then
            dbms_output.put_line('Text dosyasi acilamadi!');
        end if;
      
        utl_file.GET_LINE(textfile_deneme,deneme);
      
        textfile_deneme1 := utl_file.fopen(upper('lotodirectory'),'karsilastir_deneme.txt','r',32767);
      
        if not utl_file.IS_OPEN(textfile_deneme1) then
            dbms_output.put_line('Text dosyasi acilamadi!');
        end if;
      
        utl_file.GET_LINE(textfile_deneme1,deneme1);
      
        utl_file.FCLOSE_ALL;
      
        sayi := 0;
        temp := 0;

        while (dongu != -1)
        loop
          
           temp1 := temp1 + 1;
          
           if (deneme = deneme1) then
                dbms_output.put_line('Oldu bu is! Sayilar tuttu -->'||deneme||' ---- '||deneme1);
                dongu := -1;
                raise dogru;
           end if;
          
           for i in 1..6
           loop
                arrayden(i) := trunc(dbms_random.VALUE(1,50));
           end loop;
          
           for i in 1..6
           loop
                sayi := sayi + 1;
                for f in 1..6
                loop
                if (arrayden(sayi) = arrayden(f) AND sayi <> f) then
                    arrayden(f) := trunc(dbms_random.VALUE(1,50));
                end if;
                end loop;
           end loop;
      
           for i in 1..6
           loop
                for j in reverse 1..5
                loop
                if (arrayden(j)>arrayden(j+1)) then
                    temp := arrayden(j);
                    arrayden(j) := arrayden(j+1);
                    arrayden(j+1) := temp;
                end if;
                end loop;
           end loop;
          
           deneme1 := (arrayden(1)||' '||arrayden(2)||' '||arrayden(3)||' '||arrayden(4)||' '||arrayden(5)||' '||arrayden(6));
           sayi := 0;
           temp := 0;
           commit;
        end loop;
      
        exception
        when yanlis_deger then
            dbms_output.put_line('Lutfen girdiginiz loto degerini kontrol ediniz!');
        when dogru then
            dbms_output.put_line('Sonuclar '||temp1||' kadar donguden sonra sonuclandi.');
        when others then
            dbms_output.put_line(SQLCODE||' - '||SQLERRM);
    end;
end;
/

Ekran Görüntüsü



Hiç yorum yok:

Takip et: @oganozdogan