Packages
projelerde çok sayıda fonksiyon ve procedure olabilir. Üretimin fonksiyonları nelerdir toparlayalım !
fonkskiyon ve procedurelerin ne için oluşturulduğunun bilinmesi gerekir.
paket (package) prosedur ve fonksiyonları bir arada toplar. 2 kısımdan oluşur spec ve body,
spec : tanımların tutulduğu yer.
body : kodların tutuldugu yer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
CREATE OR REPLACE PACKAGE tarihsaat is --as de kullanılabilir. function tarih_dondur return varchar2; function saat_dondur return varchar2; procedure tarih_saat_yazdir ; --procedurun dönüş tipi yokmuş end ; CREATE OR REPLACE PACKAGE BODY tarihsaat is function tarih_dondur return varchar2 is tarih varchar2(20); begin select to_char(sysdate, 'DD/MM/YYYY') into tarih from dual; return tarih ; end; function saat_dondur return varchar2 is saat varchar2(20); begin select to_char(sysdate, 'HH24:MI:SS') into saat from dual; return saat; end; procedure tarih_saat_yazdir is begin dbms_output.put_line(sysdate); end; end; |
tanımda olan herşey body de olmak zorunda dışarı açılması istenmeyen program parçaları spec kısmına konulabilir.
Fonk ve prosedürü dışarı kapama şansı yoktur ama paket dışarı kapanabilir.
paket
1 |
select TARIHSAAT.SAAT_DONDUR from dual ; -- şeklinde çalıştırılabilir. |
procedure bu şekilde çalıştıramayız ya begin end arasında ya da exec ile çalıştırabiliriz.
paketten herhangi bir sey cagrıldıgında paketteki hersey memory ye yüklenir.
projelerde kendi başına fonk/proce olmamalı herşey paketlerde olmalı. Profesyonel projeler için herşeyi paket içinde oluşturmak en iyisi
Örnek :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CREATE OR REPLACE PACKAGE dept_ISLERI is procedure dept_ekle(p_deptno number, p_deptadi varchar2); procedure dept_cikar(p_deptno number); --procedure dept_yazdir; --function dept_adi_getir (p_deptno number) return varchar2; --function dept_sayisi_getir return number; end; CREATE OR REPLACE PACKAGE BODY dept_ISLERI is procedure dept_ekle(p_deptno number, p_deptadi varchar2) is begin insert into dept(department_id, department_name) values (p_deptno, p_deptadi); end; procedure dept_cikar(p_deptno number) is begin delete from dept where department_id = p_deptno; if (SQL%NOTFOUND) then raise_application_error(-20100, 'Böyle bir department yok'); end if; exception when others then raise_application_error(-20100, SQLERRM); end; end; |
UTL
oracle sunucuda fiziksel dosya açma okuma yazma işlemleri için kullanılır (CSV vb.) (sunucu üzerinde , client üzerinde değil)
mail göndermek için utl_mail
dosya okuma yazma işlemleri için utl_file
employees kayıtlarını okuyup bir text file yazdırmak için.
utl_file “c:” nin root una yazdıramazsınız ama bir direktory ye yazdırabilirsiniz.
create directory Raporlar as ‘/u02/UTL_Klasor’ ;
-kullanıcıya directory oluşturma izni verilebilir.
grant create any directory to kullanıcı_ismi;
ya da
system kullanıcısı ile directory oluşturup kullanıcıya okuma yazma hakkı verilir.
grant read,write on directory Raporlar to kullanıcı_adı ;
Kullanıcının(user) klasörü (directory) yoktur kim oluşturursa oluştursun sys ait görünüyor “dba_directories” den sorgulanabilir.
1 2 3 4 5 6 7 8 9 10 11 |
UTL_FILE, parametreleri fopen ; Dosyayı açar is_open : dosya açıkmı kapalı mı put : birşey yazmak için new_line : alt satıra geçmek için put_line : yazıp alt satıra geçmek için get_line : okumak için put lar yazmak için get ler okumak için fseek : dosyayı bulmak için fclose : dosyayı kapatmak için. |
directory ismi mutlaka büyük harflerle yazılmalı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
declare textfile utl_file.file_type; cursor c_employees is select employee_id, first_name, last_name from employees ; satir varchar2(500); begin textfile := utl_file.fopen('RAPORLAR','employees_kayit.txt','w',32767); for r_employees in c_employees loop satir := r_employees.employee_id||','||r_employees.first_name||','||r_employees.last_name; utl_file.PUT_LINE(textfile,satir); end loop; utl_file.fclose(textfile); end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
declare satir varchar2(500); --4000 e kadar çıkabilir. textfile utl_file.file_type; begin textfile := utl_file.FOPEN('RAPORLAR','employees_kayit.txt','r',32767); if not utl_file.IS_OPEN(textfile) then dbms_output.put_line('Dosya Acilamadi'); else loop utl_file.GET_LINE(textfile,satir); dbms_output.put_line(satir); end loop; end if ; utl_file.fclose(textfile); exception when no_data_found then utl_file.fclose(textfile); when others then dbms_output.put_line(SQLERRM); utl_file.FCLOSE_ALL; end ; |
RMAN ile farklı...
12 Mart 2019