Oracle nin SQL dili olan PL/SQL'de birçok özellik bulunmaktadır.  Bunlardan biri de collection'lardır. En temel anlamda collection, dizi  veya küme demektir. PL/SQL ile oluşturulan collectionları Oracle  üzerinde nested table şeklinde saklayabilirsiniz. Bu, varolan bir tablo  içinde başka bir tablo oluşturma anlamına gelmektedir. İsterseniz bu  tabloyu, veritabanı içinde ayrı bir yerde isterseniz de o tablo içinde  oluşturabilirsiniz. 
Collection tiplerini veritabanında tutmak  yerine ayrı bir tablo yapıp tutmak da isteyebilirsiniz. Bu, birçok  programcının yaptığı durumdur. Bu şekilde DML işlemleirini daha  zahmetsiz halledersiniz. Collection tiplerinin faydası, içinde  tuttuğunuz verinin düzenini sağlamasıdır. Yani collection içinde ilk  elemanınız neyse her zaman ilk elemanınız o olacaktır. Bundan başka  collection tiplerinin single-statement fetching ile alınıp daha hızlı  işlenceği de belirtilebilir. 
Sonuç olarak bunu kullanmak veya  kullanmamak sizin elinizde. PL/SQL'in bunu desteklediğini bilmeniz bile  size fayda sağlayacaktır.
Aşağıda bir collection tipinin  veritabanında saklanması olayının örnek bir senaryosu bulunmaktadır. Kod  bloğu, bazı özelliker içermesi bakımından önemlidir:
drop işlemleri:
drop type employee_tab;
drop type employee_obj;
drop table company;
Nesne oluşturulması
CREATE OR REPLACE TYPE employee_obj IS OBJECT
(
  full_name       VARCHAR2(64),
  department_name VARCHAR2(32),
  job_name        VARCHAR2(32)
);   
Nesne dizisi(collection) oluşturulması
CREATE OR REPLACE TYPE employee_tab IS TABLE OF employee_obj;
Collection tipinde bir kolonu bulunan tablonun oluşturulması. Bu collection veritaanı içinde ayrı bir yerde saklanacaktır.
create table company( id number, open_date date, employees employee_tab) 
nested table employees store as employees_nt;
Saklandığının gösterilmesi
SELECT * FROM user_objects WHERE object_name = 'EMPLOYEES_NT';
Ekleme işleminin yapılması. Normal ekleme şeklinde değil, collection ları kabul edecek şekilde eklenme
INSERT INTO company
VALUES
  (1,
   SYSDATE,
   employee_tab(employee_obj('Anrew Kill', 'HR', 'HR Director'),
                employee_obj('Maria Born', 'HR', 'HR Asistant'),
                employee_obj('Ted Borry', 'IT', 'IT Manager')));
INSERT INTO company
VALUES
  (2,
   SYSDATE,
   employee_tab(employee_obj('Mariana Polii', 'IT', 'IT Director')));
Tablonun select edilmesi
SELECT employees FROM company WHERE id = 2;
--Mariana Polii    IT    IT Director
Değişiklik yapılması 
DECLARE
  ind            NUMBER;
  employees_list employee_tab;
  CURSOR employees_cur IS
    SELECT employees FROM company WHERE id = 2;
BEGIN
  OPEN employees_cur;
  FETCH employees_cur
    INTO employees_list;--Single-statament assignment
  CLOSE employees_cur;
  ind := employees_list.FIRST;--ilk elemanın indisi
  WHILE ind IS NOT NULL LOOP--elemanlar bitinceye kadar
    IF employees_list(ind).department_name = 'IT' THEN
      employees_list(ind).department_name := 'Information Tech';
    END IF;
    ind := employees_list.NEXT(ind);--sonraki elemanın indisi
  END LOOP;
  UPDATE company SET employees = employees_list WHERE id = 2;--güncelleme
END;
Değişikliğin kontrol edilmesi
SELECT employees FROM company WHERE id = 2;
--Mariana Polii    Information Tech    IT Director
No comments:
Post a Comment