AZEROUG qrupunun 14 Sentyabr görüşü baş tutdu.

Posted on 16 Sentyabr 2013. Filed under: Java, JDBC, Oracle, PL/SQL, SQL | Etiketlər: , , , , , |

14 Sentyabr 2013 tarixində AZEROUG qrupunun növbəti görüşü Azercell Plazada baş tutdu. Təxmini 60 nəfər iştirakçı var idi.

Təşkilati dəstəyə görə Azercell Barama İnnovasiya mərkəzinə təşəkkürümü bildirirəm.

Bu görüşdə Oracle PL/SQL proqramlaşdırma ilə bağlı 2 təqdimat oldu.

Mənim təqdimatım Oracle 12c verilənlər bazasında proqramçılar üçün təqdim edilmiş yeniliklər haqda idi. Təqdimatda SQL, PL/SQL və JDBC ilə bağlı yeniliklər haqda məlumat verdim, VirtualBoxda qurulmuş Oracle 12c bazasında nümunə scriptlər göstərdim.

Təqdimatı buradan yükləyə bilərsiniz.

Görüşdən bəzi şəkillərə baxa bilərsiniz.

Tam Yazını Oxu | Make a Comment ( None so far )

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!

Tam Yazını Oxu | Make a Comment ( 4 so far )

Java ilə Oracle PL/SQL proqramlarının istifadəsi

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

Bu yazıda Oracle verilənlər bazasındakı PL/SQL prosedur və funksiyalarının Java proqramında istifadəsini göstərəcəyəm.
Nümunə olaraq HR sxemasındakı EMPLOYEES cədvəlini istifadə edəcəyəm.
Əvvəlcə EMPLOYEES cədvəlinə yeni işçi əlavə etmək üçün aşağıdakı PL/SQL prosedurunu yazaq.

create or replace procedure add_employee(
  p_employee_id out employees.employee_id%type,
  p_first_name in employees.first_name%type,
  p_last_name in employees.last_name%type,
  p_email in employees.email%type,
  p_hire_date in employees.hire_date%type,
  p_salary in employees.salary%type,
  p_department_id in employees.department_id%type,
  p_job_id in employees.job_id%type
)
is
begin
  select employees_seq.nextval into p_employee_id from dual;

  -- Oracle 11g bazasında sequence obyektini aşağıdakı kimi istifadə etmək mümkündür. 
  --p_employee_id := employees_seq.nextval;
  
  insert into employees(employee_id, first_name, last_name, email, hire_date, salary, department_id, job_id)
  values( p_employee_id, p_first_name, p_last_name, p_email, p_hire_date, p_salary, p_department_id, p_job_id);
end add_employee;

Bu prosedurda yeni işçiyə aid id sütununun avtomatik generasiyası üçün EMPLOYEES_SEQ obyekti istifadə olunur və onun qiyməti p_employee_id parametrinə mənimsədilib geri qaytarılır. Buna görə də həmin parametr out olaraq təyin edilib.

Bu prosedurunu aşağıdakı anonim PL/SQL bloku ilə yoxlamaq olar.

DECLARE
  l_new_emp_id NUMBER;
BEGIN
  add_employee(p_employee_id => l_new_emp_id, p_first_name => 'Ulvi', p_last_name => 'Qasimov', 
      p_department_id => 60, p_job_id => 'IT_PROG', p_email => 'ulvi@yahoo.com', 
      p_hire_date => to_date('14.02.2011', 'dd.mm.yyyy'), p_salary => 2000);
  dbms_output.put_line('Yeni isci kodu =  ' || l_new_emp_id);
END;

Bu proseduru Java proqramından aşağıdakı kimi çağırmaq olar. Aşağıda ancaq lazımi kod bloklarını yazmışam, proyektin tam versiyasını aşağıdakı linkdən yükləyə bilərsiniz.
Java ilə PL/SQL prosedur və funksiyasını çağırmaq üçün CallableStatement sinifi istifadə olunmalıdır.

String sql = "";
CallableStatement callableStatement = null;
// Yeni isci elave etmek
long id = 0;
String firstName = "Əli";
String lastName = "Əliyev";
String email = "ali@yahoo7.com";
double salary = 2222.0;
String job = "IT_PROG";
Date hireDate = new Date(); // bu gunku tarix
long department = 60;

// ? işarələri parametrləri göstərir, sırasına uyğun olaraq məlumatları vermək lazımdır.
sql = "{call add_employee(?,?,?,?,?,?,?,?)}";
callableStatement =  connection.prepareCall(sql);

// 1-ci parameter <strong>p_employee_id</strong> out parametr olduğuna görə onu ayrıca qeyd etmək lazımdır. 
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, firstName);
callableStatement.setString(3, lastName);
callableStatement.setString(4, email);
callableStatement.setDate(5, convert(new Date()));
callableStatement.setDouble(6, salary);
callableStatement.setLong(7, department);
callableStatement.setString(8, job);
// proseduru işlədirik
callableStatement.executeUpdate();
// p_employee_id parametrinin qiymətini çap edirik
id = callableStatement.getLong(1);
System.out.println("Yeni isci kodu = " + id);

Burada bir neçə vacib məqamlar var:
1.JDBC ilə PL/SQL prosedurunu çağırmağın sintaksisi aşağıdakı kimidir:
{call prosedur_adı(parametr1, parametr2, … parametrN)}
Burada hər bir parametr üçün bir sual işarəsi yazılmalıdır.
2.Out parametrlər aşağıdakı kimi təyin edilməlidir:
callableStatement.registerOutParameter(parametr_sira_nomresi, parametr_tipi);
Parametr tipi olaraq java.sql.Types sinifindəki sabit qiymətlərdən uyğun olanı göstərmək lazımdır.
3.executeUpdate() metodu ilə proseduru işlədirik və bundan sonra out parametrlərinin qiymətini oxuyuruq.

İndi isə PL/SQL funksiyasının Java ilə necə istifadə olunmağına baxaq.
Əvvəlcə aşağıdakı kimi sadə bir funksiya yazaq.

create or replace function topla(a in number, b in  number)
return number
is
begin 
  return a+b;
end topla;

Bu funksiyanı Java proqramından aşağıdakı kimi çağıra bilərik.

sql = "{call ? := topla(?,?)}";
callableStatement = connection.prepareCall(sql);
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setInt(2, 5);
callableStatement.setInt(3, 7);
callableStatement.executeUpdate();
int netice = callableStatement.getInt(1);
System.out.println("Netice = " + netice);

Burada vacib olan məqam funksiyadan qayıdan qiymətin java ilə necə oxunmasıdır.
? := ifadəsində bərabərlikdən əvvəlki ? işarəsi funksiyadan qayıdan qiyməti saxlayan parametrdir və out rejimində təyin edilməlidir.

Ümid edirəm ki, aydın oldu.
Proyektin tam kodunu aşağıdakı linkdən yükləyə bilərsiniz.
http://www.boxca.com/qqsybk73v3ll/JdbcPlsql.zip.html

Tam Yazını Oxu | Make a Comment ( 1 so far )

Oracle PL/SQL proqramlarında asılılıqların idarəsi

Posted on 7 Sentyabr 2010. Filed under: PL/SQL | Etiketlər: , , , |

Bu yazıda Oracle 10g və 11g VBİS-lərində PL/SQL proqramlarında asılılıqları idarəsi və fərqlərini izah etməyə izah edəcəm.

Oracle VBİS-i PL/SQL proqramlarının digər obyektlərdən asılılığını tam obyekt səviyyəsində izləyir. Bu o deməkdir ki, hər hansı bir cədvələ yeni sütun əlavə edilsə, ondan asılı olan bütün obyektlər(view, procedure, function və s.) avtomatik olaraq invalid olacaq. Amma bizim prosedur məntiqi olaraq yeni əlavə edilmiş sütundan asılı deyil, onu istifadə etmir. Eyni məsələ bizim prosedurun select etmədiyi hər hansı bir sütunun tipinin dəyişməsi üçün də keçərlidir. Cədvəlin hər hansı bir sütunu dəyişdirildikdə, bizim prosedur ondan asılı olmasa da Oracle VBİS-i onu avtomatik olaraq invalid edir. Oracle 11g VBİS-də bu vəziyyət müsbət yöndə dəyişdirilmişdir. Artıq Oracle 11g VBİS-i asılılıqları tam obyekt səviyyəsində yox, daha kiçik səviyyədə izləyə bilir.

Bu məsələyə əvvəlcə Oracle 10g VBİS üzərində baxaq.

SYS istifadəçisi ilə Oracle 10g VBİS-nə qoşuluruq.

HR istifadəçisi altında aşağıdakı paketi yaradırıq:

create or replace package hr.pkg_test
is
    function get_manager(p_employee_id in number) return varchar2;    
end pkg_test;

create or replace package body hr.pkg_test
as
    function get_manager(p_employee_id in number) 
    return varchar2
    is
        l_manager varchar2(50);
    begin
        select m.first_name || ' ' || m.last_name into l_manager 
        from hr.employees e, hr.employees m 
        where e.manager_id=m.employee_id and e.employee_id=p_employee_id;
        
        return l_manager;
    end get_manager;    
end pkg_test;

Yeni yaratdığımız paketin cari vəziyyətini yoxlayırıq.

select object_name, object_type, status 
from all_objects
where owner='HR' and object_name='PKG_TEST'

Paket içərisindəki GET_MANAGER funksiyası verilmiş işçi koduna əsasən onu rəhbərinin adını, soyadını qaytarır. Bu funksiya HR.EMPLOYEES cədvəlinin EMPLOYEE_ID, MANAGER_ID, FIRST_NAME və LAST_NAME sütunlarından asılır. Bu cədvəlin strukturu aşağıdakı kimidir:

İndi isə bu cədvəldəki email sütununu aşağıdakı kimi dəyişək:

alter table hr.employees
modify email varchar2(40);

Paketin cari vəziyyətinə baxaq:

Gördüyünüz kimi GET_MANAGER funksiyası email sütunundan asılı olmasa, bütün paket invalid oldu.

GET_MANAGER funksiyasını istifadə etsək, Oracle əvvəlcə paketi kompilyasiya edəcək, statusu valid olduqdan sonra onu istifadə etməyimizə imkan verəcək.

select hr.pkg_test.get_manager(110)  from dual;


Oracle 11g VBİS-də asılılıqların idarəsi daha da inkişaf etdirilmilmişdir, artıq PL/SQL proqramlarının asılılığı obyektin içindəki elementlər səviyyəsində izlənilir. Eyni əməliyyatları Oracle 11g VBİS-də yoxlayaq.

Əvvəlcə SYS istifadəçisi ilə Oracle 11g VBİS-nə qoşuluruq.

Eyni paketi yeni bazada yaradıb vəziyyətini yoxlayaq:

Email sütununu aşağıdakı kimi dəyişib paketin statusunu təkrar yoxlayaq:

alter table hr.employees
modify email varchar2(40);


Gördüyünüz kimi paketin statusu valid olaraq qaldı, çünki o email sütunundan asılı deyil.

İndi isə manager_id sütununu aşağıdakı kimi dəyişək və paketin cari vəziyyətinə baxaq:

alter table hr.employees
modify manager_id number(7);


Gördüyünüz kimi manager_id sütunu dəyişildikdən sonra paket avtomatik olaraq invalid oldu, çünki həmin sütun get_manager funksiyasında istifadə olunur.

Fine-grained dependency haqqında daha ətraflı məlumat almaq üçün aşağıdakı qaynağa müraciət edə bilərsiniz:

Oracle® Database Advanced Application Developer’s Guide, 11g Release 2 (11.2), Part Number E10471-05, “18.Schema Object Dependency”


Ümid edirəm ki, Oracle 11g VBİS-dəki bu yenilik aydın oldu. Sual, tənqid və təklifləriniz üçün şərh yazmaqdan çəkinməyin!
Uğurlar!

Tam Yazını Oxu | Make a Comment ( 2 so far )

Oracle 11g PL/SQL- Continue əmri

Posted on 5 Aprel 2010. Filed under: Oracle, PL/SQL | Etiketlər: , , , |

Nəhayət ki, Oracle 11g versiyasında bir çox proqramlaşdırma dillərində olan CONTINUE əmri PL/SQL-ə də əlavə olundu.
CONTINUE əmri iterasiya blokunda müəyyən bir şərtə bağlı olaraq növbəti addıma keçid edir, ondan sonrakı sətirlər icra edilmir.

PL/SQL-də CONTINUE əmri 2 cür istifadə olunur
1. CONTINUE
2. CONTINUE WHEN

1-ci istifadə qaydasına aşağıdakı sadə nümunə üzərində baxaq.

begin
    for k in 1 .. 20 
    loop 
        if mod(k, 2)=0 then
            continue;
        end if;
        dbms_output.put_line(k);
    end loop;
end;

Verilmiş nümunədə for iterasiya bloku 1-dən 20-yə qədər sayır, if mod(k, 2)=0 şərti ilə k ədədinin cüt olub olmadığı yoxlanılır (MOD funksiyası bölmədən qalan qalığı verir, 2-yə bölünəndə qalığın 0-a bərabər olması ədədin cüt olduğunu göstərir).
Əgər şərt doğrudursa, CONTINUE əmri işləyir və növbəti addıma keçilir, şərt blokundan sonrakı sətirlər icra olunmur. Bu da o deməkdir ki, tək ədədlər üçün şərt səhv olur və dbms_output.put_line(k); kod sətri ilə həmin tək ədədlər output-a yazılır. Nəticədə 1-dən 20-yə qədər olan tək ədədlər yazılmış olur.

2-ci istifadə qaydasına aşağıdakı sadə nümunə üzərində baxaq.

begin
    for k in 1 .. 20 
    loop 
        continue when mod(k, 2)=0;
        dbms_output.put_line(k);
    end loop;
end;

Bu nümunədə 1-cidən fərqli olaraq şərt bloku yoxdur və həmin şərt when ilə bir başa continue əmri içərisində yoxlanılır. Nəticə olaraq hər 2 nümunə eyni işi görür, bir birinə ekvivalentdir.

Oracle 11g PL/SQL-dəki yeniliklər haqqında silsilə yazılar üçün bu səhifəyə keçin. https://raminorucov.wordpress.com/oracle-11g-plsql-yenilikleri

Tam Yazını Oxu | Make a Comment ( 2 so far )

Video dərslər

Posted on 31 Mart 2010. Filed under: Java, Java web texnologiyaları, Oracle, PL/SQL, SQL, Video dərslər | Etiketlər: , , , , , , , , , , , , , |

Java və Oracle proqramlaşdırmaya aid video dərslər hazırlamaq barədə fikirləşirəm. Çünki yazılı material hazırlamaq çox vaxt aparır(ya da mən tənbəlləşmişəm:D). Video dərs ilə vizual olaraq başa salmaq və kod yazaraq praktiki şəkildə göstərmək daha rahatdır.

Hələlik fikirləşdiyim mövzular aşağıdakılardır:

Java üzrə mövzular:
1.Java ilə obyekt yönlü proqramlaşdırmanın əsasları (bu mövzu üzrə 2 video dərs var)
2.JDBC ilə Oracle verilənlər bazasının istifadəsi
3.Java Servlet və JSP ilə web proqramlaşdırma
4.Spring framework və Spring MVC
5.Java Server Faces(JSF) ilə web proqramlaşdırma
6.Java web proyektlərində təhlükəsizlik məsələləri
7.Java mobil proqramlaşdırma
8.SCJP 6 CX-310-065 imtahanına hazırlıq

Oracle üzrə mövzular:
1.Oracle SQL-ə giriş
2.Oracle PL/SQL-ə giriş
3.Advanced Oracle SQL
4.Advanced Oracle PL/SQL
5.PL/SQL performance tuning və optimization

Hansı mövzular daha maraqlıdı və tələbat var?
Zəhmət olmasa, təkliflərinizi şərh olaraq yazın, müzakirə edək.

Tam Yazını Oxu | Make a Comment ( 34 so far )

Yeni sequence sintaksisi

Posted on 21 Mart 2010. Filed under: Oracle, PL/SQL | Etiketlər: , , , |

Oracle 11g-dən əvvəlki versiyalarda sequence obyektinin cari qiymətini və ya növbəti qiymətini əldə etmək üçün dual adlı virtual cədvəldən select into ilə seçib bir dəyişkənə yazmaq lazım idi.

DECLARE
l_new_id   NUMBER;
BEGIN
-- Kohne sequence istifade sintaksisi
SELECT employees_seq.NEXTVAL INTO l_new_id FROM DUAL;
DBMS_OUTPUT.put_line ('New id = ' || l_new_id);
END;

Oracle 11g R1-dən etibarən isə sequence obyektini bir başa mənimsətmə ifadəsində istifadə etmək mümkündür. Yeni sintaksis daha sadə və qısadır.

DECLARE
l_new_id   NUMBER;
BEGIN
-- Yeni sequence istifade sintaksisi
l_new_id := employees_seq.NEXTVAL;
DBMS_OUTPUT.put_line ('New id = ' || l_new_id);
END;
Tam Yazını Oxu | Make a Comment ( None so far )

    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...