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:
Yorum Gönder