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