Home / MAKALELER / Veri Tabanı / Oracle 11G ile Gelen Virtual Columns

Oracle 11G ile Gelen Virtual Columns

Merhabalar, bu yazımda Oracle 11g ile gelen sanal kolonları anlatacağım. Oracle 11G den önce herhangi bir kolonda tutulacak olan regular express yada computed expressler için viewleri kullanırdı.

Oracle 11G ile yeni gelen özelliklerden bir tanesi de sanal kolonlardır (virtual columns). Sanal kolonlar Create table cümleciğinin içindeki kolonlarla ile birlikte tanımlanırlar. Veri tabanında yer kaplamazlar, tablodan çağırıldıkları zaman, çalışma zamanında oluşturulurlar. Sanal kolonlarda veri insert edilmez. Üzerinde indeks tanımlanabilir. Diğer tablolara foreign key olarak tanımlanabilirler. Sanal kolon üzerinden partition yapılabilir.

Oracle 11G de virtual column için sytax;

column_name [datatype] [GENERATED ALWAYS] AS (expression) [VIRTUAL]

Virtual kelimesini kullanmak opsiyoneldir.

CREATE TABLE temp_virtual_col_tabl (
dept_id NUMBER,
dept_desc VARCHAR2(10),
salary NUMBER(9,2),
comm_1 NUMBER(3),
comm_2 NUMBER(3),
salary_1 AS (ROUND(salary +(comm_1/10),2)),
salary_2 NUMBER GENERATED ALWAYS AS (ROUND(salary + (comm_2/4),2)) VIRTUAL,
CONSTRAINT employees_pk PRIMARY KEY(dept_id);

Yukarıdaki tablodasalary_1 ve salary_2 sanal kolonlarını (virtual column) oluşturduk. Salary_1 salary’ye %10 com_1 eklenmiş hali, salary_2 ise salary’ye %25com_2 eklenmiş halidir. Şimdi örnek tabloya veri insert edelim.

insert into temp_virtual_col_tabl (DEPT_ID, DEPT_DESC, SALARY, COMM_1, COMM_2) values (1,’Managing’,5000,100,250);

insert into temp_virtual_col_tabl (DEPT_ID, DEPT_DESC, SALARY, COMM_1, COMM_2) values (2,’HR’,3000,50,100);

Şimdi de sanal kolonların üzerinde indeks oluşturalım.

create index indx_temp_virtual on temp_virtual_col_tabl(salary_1);

create index indx_temp_virtual2 on temp_virtual_col_tabl(salary_2);

Sanal kolonlar veri tabanında derlenmiş bir fonksiyonun geri dönüş değeri de olabilir. Bunun için örnek bir fonksiyon tanımlayalım.

CREATE OR REPLACE FUNCTION sp_sum_virtual (in_num_1 NUMBER, in_num_2 NUMBER)
RETURN NUMBER DETERMINISTIC
AS
BEGIN
RETURN in_num_1 + in_num_2;
END;

Bu fonksiyonu kullanarak tabloya yeni bir sanal kolon ekleyelim.

ALTER TABLE temp_virtual_col_tabl ADD total_comm GENERATED ALWAYS AS (muser.sp_sum_virtual(salary,comm_1));

Burada dikkat edilmesi gereken önemli nokta fonksiyon bazlı sanal fonksiyonlar için EXECUTE IMMEDIATE ile grant verilebilir olmasıdır. Kullanıcının kendi kendine yetki veremez ama yetki verebilen bir kullanıcı tabloya select attığında EXECUTE IMMEDIATE ile verilen komutlar çalışır. İstenmeyen durumlar olabilir. Örnek olarak korsan olarak DBA hakkının alınmasını gösterelim;

CREATE OR REPLACE FUNCTION SP_GET_GRANT (v_value IN VARCHAR2)
RETURN VARCHAR2
AUTHID CURRENT_USER
DETERMINISTIC
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE ‘grant dba to db_user;

RETURN ‘1’;
END SP_GET_GRANT;

Yukarıdaki fonksiyon sanal kolon olarak kullanıldığın zaman, DBA kullanıcı ilgili tabloya select atarsa db_user kullanıcı DBA hakkını alacaktır. Burada unutulmaması gereken şey şudur; bir sanal kolondan tekrar yeni bir sanal kolon oluşturulamaz. Sanal kolonlar üzere comment de verilebilir.

COMMENT ON COLUMN TEMP_VIRTUAL_COL_TABL.TOTAL_COMM is ‘Fonksiyon bazlı sanal kolon’;

About Ahmet Sedef

1986 yılı Yozgat doğumluyum. İlk, ortaokul ve lise eğitimimi Yozgat'ta tamamladım. 2010 yılında Yıldız Teknik Üniversitesi İstatistik Bölümünden mezun oldum. Lisans eğitimim süresinde Türkiye istatistik Kurumu ve SAS Türkiye'de staj yaptım. Kariyerime iş zekası alanında devam ediyorum. İlgi Alanımlarım; Oracle, MS SQL Server, PL/SQL, T-SQL, Java,JavaScript,Informatica PowerCenter, Oracle Data Integrator,Datastage, Diğer ETL toolları, Hyperion EPM, OBIEE

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın