Java proqramından PL/SQL cursorunun istifadəsi

Posted on 19 Fevral 2011. Filed under: Java, JDBC, Oracle, PL/SQL | Etiketlər: , , , , , |


Bu yazıda Java proqramında PL/SQL prosedurunda təyin olunmuş cursor-un istifadəsini izah edəcəm.
Bunun üçün PL/SQL proqramlarında cursor-un nə olduğunu və necə istifadə olunduğunu bildiyinizi fərz edirəm.

Nümunə HR sxeması üzərində belə bir məsələyə baxaq.
Elə bir PL/SQL proqramı yazmaq lazımdır ki, ona verilmiş işçi əgər hansısa bir şöbənin rəhbəridirsə, onda həmin şöbədəki bütün prosedur işçilərin siyahısını qaytarsın. Əgər verilmiş işçi heç bir şöbənin rəhbəri deyilsə, onda özü və əgər varsa, onun tabeliyində olan işçilərin siyahısını qaytarmaq lazımdır. Prosedurdan qayıdan nəticə ona giriş olaraq göndərilmiş işçinin vəziyyətindən asılıdır.
Bu məsələnin cavabı olaraq aşağıdakı PL/SQL proqramını yazmaq olar.

create or replace procedure test_dyn_manager(p_employee_id in number, p_employee_list out sys_refcursor)
is
  l_dept_id number;
  cursor dept_cur 
  is 
    select department_id from departments
    where manager_id=p_employee_id;
begin
  open dept_cur;
  fetch dept_cur into l_dept_id;
  close dept_cur;
  
  if l_dept_id is not null
  then 
    open p_employee_list for 'select employee_id, first_name, last_name, job_id ' ||
      ' from employees where department_id='||l_dept_id || 
      ' order by department_id';      
  else
    open p_employee_list for 
      'select employee_id, first_name, last_name, job_id from employees where manager_id='||p_employee_id ||
      ' union all ' ||
      ' select employee_id, first_name, last_name, job_id from employees where employee_id='||p_employee_id ||
      ' order by employee_id'; 
  end if;
end test_dyn_manager;

Bu prosedurda əvvəlcə işçinin hər hansı bir şöbənin rəhbəri olub olmadığı yoxlanılır.
Əgər şöbə rəhbəridirsə, onda out parametr olaraq təyin olunmuş p_employee_list cursoru həmin şöbədəki işçilərin siyahını verən select sorğusu ilə əlaqələndirilir. Əgər işçi şöbə rəhbəri deyilsə, onda p_employee_list cursoru işçinin özünü və varsa, onun tabeliyindəki işçiləri verən select sorğusu ilə əlaqələndirilir.

Bu proseduru yoxlamaq üçün aşağıda anonim PL/SQL blokunu yazaq.

declare
  --l_emp_id number:= 103; -- Alexander	Hunold IT sobesinin rehberi
  --l_emp_id number := 101; -- Neena	Kochhar sobe rehberi deyil, amma tabeliyinde isciler var   
  l_emp_id number:= 204; -- Hermann Baer rehber deyil, sade iscidir
  l_emp_list sys_refcursor;  
  l_id number;
  l_first_name employees.first_name%type;
  l_last_name employees.last_name%type;
  l_job_id employees.job_id%type;
Begin
  test_dyn_manager(l_emp_id, l_emp_list);
  loop
    fetch l_emp_list into l_id, l_first_name, l_last_name, l_job_id;    
    exit when l_emp_list%notfound;
    dbms_output.put_line('Emp_id=' || l_id || ' first_name=' || l_first_name || ' last_name=' || l_last_name || ' job_id=' || l_job_id);
  end loop;
  close l_emp_list;
end;

İndi isə yazdığımız proseduru Java proqramından çağırıb istifadə edək. Aşağıdakı proseduru çağırmaq üçün lazım olan minimum kod blokunu verirəm. Proqramın tam kodunu yazının sonundakı linkdən proyekti yükləyərək əldə edə bilərsiniz.

            long id = 103;
            String firstName = "";
            String lastName = "";
            String job = "";
            
            String sql = "{call test_dyn_manager(?,?)}";
            callableStatement = connection.prepareCall(sql);
            callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
            callableStatement.setLong(1, id);
            callableStatement.executeUpdate();
            ResultSet rs = (ResultSet) callableStatement.getObject(2);

            while(rs.next()) {
                id = rs.getLong("employee_id");
                firstName = rs.getString("first_name");
                lastName = rs.getString("last_name");
                job = rs.getString("job_id");            
                System.out.print("Id = " + id);
                System.out.print(" employee = " + firstName + " " + lastName);
                System.out.print(" job " + job);
                System.out.println();
            }

Prosedurun 2-ci parametrini out olaraq təyin etmək lazımdır. Bu zaman tip olaraq OracleTypes.CURSOR göstərilməlidir ki, sys_refcursor tipli bu parametrin Javada ResultSet obyekti olaraq oxumaq mümkün olsun.

Ümid edirəm ki, aydın oldu.
Proqramın tam versiyasını aşağıdakı linkdən yükləyə bilərsiniz.
http://www.boxca.com/70cfriqt1gsh/JdbcSysRefCursor.zip.html
Oracle bazasına qoşulmaq üçün lazımi konfiqurasiya məlumatları database.properties faylında yazılıb, öz sisteminizə uyğun dəyişə bilərsiniz.
Prosedurun kodu və test sql, pl/sql sorğuları database.sql faylına yazılıb.

Sual, tənqid və təkliflərinizi şərh olaraq yaza bilərsiniz.
Uğurlar!

Make a Comment

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

4 Cavab to “Java proqramından PL/SQL cursorunun istifadəsi”

RSS Feed for Ramin Orucovun Java və Oracle bloqu Comments RSS Feed

Ramin müəllim.
Əladır.
Amma bir sualim var, eyni sql-leri javanin ozdən də göndərib nəticə əldə edə bilərik. Sizce hansı daha tez işləyir?

Konkret bu məsələdə PL/SQL proqramı Javaya görə 1 select üstün olacaq.
İşçinin şöbə rəhbəri olub olmadığını yoxlamaq üçün select sorğusu bir başa baza içərisində işləyir, vaxt baxımından üstün olacaq.

Ümumiyyətlə isə əgər proqram tərəfdən çoxlu select edib, müxtəlif hallar nəzərə alınıb sonda insert/update/delete əməliyyatı edilirsə, bunu PL/SQL-də yazmaq daha sürətli olacaq. Java tərəfdən select edəndə nəticələr network ilə java proqramına göndərilir, PL/SQL proqramı isə bir başa bazanın içərisində işləyir, əlavə network trafiki yaratmır.

Eyni məsələni Java ilə həll etmək üçün əlavə selectlər

Ramin mellim yerlewdirdiyiniz link qarwiliqsizdi.zehmet olmasa diqqet yetirersiz

Boxca.com uzun müddət yüklənilməyən faylları avtomatik silir, gərək başqa yerə qoyum.


Where's The Comment Form?

    Haqqında

    Java ilə obyekt yönlü proqramlaşdırma, Java web proqramlaşdırma, Oracle SQL, PL/SQL proqramlaşdırma, optimallaşdırma

    RSS

    Subscribe Via RSS

    • Subscribe with Bloglines
    • Add your feed to Newsburst from CNET News.com
    • Subscribe in Google Reader
    • Add to My Yahoo!
    • Subscribe in NewsGator Online
    • The latest comments to all posts in RSS

    Meta

Liked it here?
Why not try sites on the blogroll...

%d bloqqer bunu bəyənir: