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!

Advertisements
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 )

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