Prosedur ile insert,update delete gibi işlemler yaptırılır. Prosedurlerle select işlemleri pek yapılmaz, yapısı pek uygun değildir.
Tablo silerken kimi drop, kimi purge ı kullanılıyor standart kullanım için prosedur yazıp herkesi bunu kullanmaya zorlayabiliriz. Buna dba karar verir
1 2 3 4 5 |
create or replace procedure tablo_dusur (p_tabloadi varchar2) is begin execute immediate 'drop table ' || p_tabloadi || ' purge' ; -- ' purge' şeklinde olacak. ' ile purge arasında boşluk olacak. dbms_output.put_line(p_tabloadi || ' tablosu düşürüldü. '); end; |
1 2 3 |
begin tablo_dusur ('employees_2') ; end; |
iki şekilde de çalıştırılabilir.
1 |
exec tablo_dusur('employees_3'); |
create or replace procedure dept_ekle (p_deptid number, p_deptadi varchar2) is
1 2 3 4 5 |
begin insert into dept(department_id, department_name) --DDL olduğu için exec e gerek kalmadan direk yazılabilir. values (p_deptid, p_deptadi); commit; end; |
1 |
exec dept_ekle(800, 'sekizyuz') |
1 2 |
select upper('ibrahimİBRAHİM') from dual; ----->IBRAHIMİBRAHİM select lower('IĞDIRığdırİBRAHİM') from dual; --->iğdirığdırıbrahım |
Bu oracle ın bug ıdır.
1 2 |
select 'ismail' from dual; select replace('ismail','i','İ') from dual; |
küçük “i” leri replace yapılarak çözebiliriz.
1 2 3 4 5 6 7 |
select upper('ibrahimİBRAHİM') from dual; select lower('IĞDIRığdırİBRAHİM') from dual; select 'ismail' from dual; select replace('ismail','i','İ') from dual; from personel where upper(lower(ad))=upper(lower('omer')) where buyult(ad)=buyult('omer') |
Çalıştıran Kullanın tablolarını ve indexlerinin istatistiklerini toplar.
1 2 3 4 5 6 7 8 9 10 11 |
create or replace procedure tablo_istatistikleri_topla is cursor c_tablo is select table_name from user_tables; begin for r_tablo in c_tablo loop execute immediate 'analyze table ' || r_tablo.table_name || ' compute statistics'; dbms_output.put_line(r_tablo.table_name || ' analize edildi.'); end loop; end; |
exec tablo_istatistikleri_tablo –şeklinde de çalıştırılabilir. İstenirse toad yazılımının jobs sekmesinden zamanlanabilir.
Komut ortamındada bu şekilde zamanlanabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DECLARE jobno NUMBER; BEGIN DBMS_JOB.submit (job => jobno, what => 'HR.TABLO_ISTATISTIKLERI_TOPLA;', next_date => trunc(sysdate)+23/24, interval => 'SYSDATE + 1', no_parse => TRUE ); DBMS_OUTPUT.put_line ('Created Job - the job number is:' || TO_CHAR (jobno)); COMMIT; END; / |
Not :”create table xxxxx as select * from yyy ” bu şekilde oluşturulan tablolarda constraintler taşınmıyor.
indexler tablolardaki kayıt sayısına user_tables dan bakar
1 2 3 4 5 6 7 8 9 10 |
insert Stress begin for i in 1..5 loop insert into emp2 select * from emp2 ; commit; end loop ; end; |
Bir şemadaki tabloların satır Sayısı Karşılaştıran prosedür
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Create or replace procedure satir_sayisi_karsilastir is cursor c_tablo is select table_name, num_rows from user_tables; oracle_sayi number; gercek_sayi number; begin dbms_output.put_line('GERCEK ORACLE'); dbms_output.put_line('------ ------'); for r_tablo in c_tablo loop oracle_sayi := r_tablo.num_rows; execute immediate 'select count(*) from ' ||r_tablo.table_name into gercek_sayi; if (oracle_sayi = gercek_sayi) then dbms_output.put_line(r_tablo.table_name||'-'||gercek_sayi|| '*****'||r_tablo.table_name||'-'||oracle_sayi); else dbms_output.put_line('Dikkat : '|| r_tablo.table_name||'-'||gercek_sayi|| '********'||r_tablo.table_name||'-'||oracle_sayi); end if ; end loop; end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Create or replace procedure satir_sayisi_karsilastir is cursor c_tablo is select table_name, num_rows from user_tables; oracle_sayi number; gercek_sayi number; begin dbms_output.put_line('GERCEK ORACLE'); dbms_output.put_line('------ ------'); for r_tablo in c_tablo loop oracle_sayi := r_tablo.num_rows; execute immediate 'select count(*) from ' ||r_tablo.table_name into gercek_sayi; if (oracle_sayi = gercek_sayi) then null; -- dbms_output.put_line(r_tablo.table_name||'-'||gercek_sayi|| -- '*****'||r_tablo.table_name||'-'||oracle_sayi); else dbms_output.put_line('Dikkat : '|| r_tablo.table_name||'-'||gercek_sayi|| '********'||r_tablo.table_name||'-'||oracle_sayi); end if ; end loop; end; |
not : is de as destekleniyor. end procedure name yazılabilir de yazılmayabilir de
1 2 3 4 5 6 7 8 9 10 |
in & out create or replace procedure emp_ad_soyad_getir (p_employee_id number, ad out varchar2, soyad out varchar2, maas out number) is -- (p_employee_id in number, ) burada hiçbirşey söylenmediginde aslında in denilmiş olur begin select first_name, last_name, salary into ad, soyad , maas from employees where employee_id = p_employee_id ; end ; |
aşağıdakiler sqlplus ta çalıştırırlır
1 2 3 4 5 |
variable ad varchar2(20) variable soyad varchar2(20) -- bu ikisi sqlplus da var muhtemelen toad da çalışmaz. exec easg(206, :ad, :soyad); --easg emp ad soyad getir. şeklinde çalıştırılacak. print ad print soyad |
1 |
create synonym easg for emp_ad_soyad_getir |
1 2 3 4 5 6 7 8 |
declare ad varchar2(20); soyad varchar2(20); maas number; begin easg(206, ad, soyad, maas); --iki nokta sqlplus ortamında tanımlanan değişkenlere ulaşmak için kullanılır. bu yüzden burada kullanılmıyor. dbms_output.put_line(ad||' '||soyad||' '||maas); end; |
prosedürün Fonksiyona göre avantajı ; fonk tek değer döner ya ad ya soyad yada ad soyad birleşik döner. ama ayrı ayrı iki değer dönemez. adı alıp bir değişene atamaz . prosedür bunu yapabiliyor. Fonksiyon bunları yapamaz. fonk ya number ya varchar2 dir. procedure ise out ile aynı anda birçok değişkeni ve tipini alabiliyor.
prosedure ve fonksiyona program unit de denmektedir. Bunlar üzerinde sadece çalıştırma (execute) hakkı verilebilir.
1 |
gran execute on raise_salary to student01; |
fonsiyon procedure oluştururken çıkan hataları
1 2 3 |
show errors -- ile görülebilir. veya select * from user_errors --den de görülebilir. show errors procedure raise_salary --fazla sayıda hata varsa |
Compile/Recompile
1 2 |
alter procedure raise_salary compile ; alter function raise_salary compile ; |
Not: 10G de invalid duruma düşen prog parçaları , çağrıldığında tekrar compile etmeye çalışır eğer düzeltildi ise sorun kalmaz
1 2 |
select object_name, status from user_objects |
1 2 3 |
drop procedure raise_salary ; drop function salary_valid ; drop type name ; |
1 2 3 |
select * from from user_objects where object_type='PROCEDURE' |
toad da kodu görebiliyoruz. toad yoksa user_source view/table dan da görebiliyoruz.
RMAN ile farklı...
12 Mart 2019