Etiket arşivi: Oracle 12C New Features

Oracle 12C Invisible Column

Oracle 12C invisible column:

Invisible column Oracle 12C ile gelen yeni bir özelliktir.Bir kolonu tablo yaratırken gizli olarak belirtebiliyoruz, veya daha sonradan gizli olarak işaretleyebiliyoruz.Gizlenen kolon describe(desc),select * from table, işlemlerinde görünmeyecektir.Insert işleminde,select listesinde,where kısmında kolonu belirterek kolonu kullanabiliyoruz.Invisible kolon external table,cluster table ve temp table’da desteklenmiyor. Invisible kolon maaş vb önemli bilgilerin doğrudan görünmesini engellemek için faydalı olabilir.

Örnekler için tablo oluşturalım.

Kolonun yanına yazdığımız INVISIBLE keyword’le kolonun invisible olduğunu belirtiyoruz.

CREATE TABLE Calisanlar_Tab(emp_no number(6),
name varchar2(40),
salary number(9) INVISIBLE);

Tablomuzu desc yapalım.Invisible kolon görünmeyecektir.

DESC Calisanlar_Tab;

Name      Null?  Type
----------------------------------------- -------- ----------------------
emp_no           NUMBER
name             VARCHAR2(40)

Kolonu visible yapmak için;

ALTER TABLE Calisanlar_Tab MODIFY(salary VISIBLE);

Kolonu invisible yapmak için;

ALTER TABLE Calisanlar_Tab MODIFY(salary INVISIBLE);

Tablomuza veri girişi yapalım;

insert into Calisanlar_Tab values (1,'Berna Duru');
1 row created.

İnvisible kolona veri girişi yapalım.

insert into Calisanlar_Tab(emp_no,name,salary) values (1,'Berna Duru',1500);
1 row created.

Invisible kolonları görmek için;

SELECT TABLE_NAME,  COLUMN_NAME, HIDDEN_COLUMN
  FROM USER_TAB_COLS WHERE HIDDEN_COLUMN='YES';

View oluştururken invisible kolon oluşturmak isterseniz;

Create or replace view Calisanlar_vw(emp_no,salary INVISIBLE)
as select emp_no, salary from Calisanlar_Tab;
View created.

Tablodaki tüm kolonları invisible yapmak isterseniz, maalesef en az bir tane visible kolon olmasını istiyor ve aşağıdaki hatayı veriyor..

ERROR at line 1:
ORA-54039: table must have at least one column that is not invisible

Umarım faydalı olur.

 

Oracle 12C Identity kolon

Oracle 12C identity column:

Bu makalemizde oracle 12C ile gelen identity kolonunu inceleyeceğiz,12C öncesi versiyonlarda kolon için sequence veya trigger ile artan sıralı değerler üretiyorduk,12C versiyonu ile artık otomatik olarak kolon kendisini artırabilecek.Aslında biraz geç geldiğini düşünüyorum,diğer bir çok veritabanında olmasına rağmen oracle’da yoktu.(SQL server identity vb) Performansı trigger ve sequence’e göre daha iyi.
En çok da yazılımcıların işine yarayacak , trigger ve sequence’le uğraşmayacaklar..

12C’de tablo oluştururken kolonun identity kolon oldugunu belirtiyoruz, ve tablomuza insert ederken bir değer göndermemize gerek kalmıyor.

Örnek yapalım..

CREATE TABLE person_info_tab (
kisi_id NUMBER GENERATED ALWAYS AS IDENTITY,
ad VARCHAR2(50),
soyad VARCHAR2(50));

Tablomuzu oluşturduk, veri girişi yapalım.

INSERT INTO person_info_tab (isim,soyad)  VALUES ('Ali','AKÇAY');

kisi_id kolonuna veri girmedik select çekip sonuca bakalım.

SELECT * FROM person_info_tab;
kisi_id   ad     soyad
1         Ali    AKÇAY

Eğer identity kolonuna veri insert etmek isterseniz aşağıdaki hatayı alırsınız.

INSERT INTO person_info_tab (kisi_di,isim,soyad) VALUES (1,'Ali','AKÇAY');

Hata:ORA-32795: cannot insert into a generated always identity column

Identity kolonuna veri girişine izin verilmiyor,oracle otomatik kendisi artırıyor.

12C öncesi versiyonlarda Sequence ile id üretmek:

12C öncesi versiyonlarda nasıldı, nasıl çözüyorduk ? Onu da örnekleyelim..

Tablomuzu oluşturalım.

CREATE TABLE person_info_tab (
kisi_id NUMBER,
ad VARCHAR2(50),
soyad VARCHAR2(50) );

Sıra numarası üretecek sequence’i olusturalım.

CREATE SEQUENCE kisi_id_seq start with 1 increment by 1 nocycle;

Tablomuza veri girerken kisi_id kolonuna sequence’in değerini gönderelim.

INSERT INTO person_info_tab
(kisi_di,isim,soyad)
VALUES
(kisi_id_seq.nextval,'Ali','AKÇAY');

ya da trigger ile bu atamayı da yapabiliriz.Trigger her insertte sequenceden çekeceği son değeri tabloya insert edecektir.

CREATE OR REPLACE TRIGGER kisi_id_trg
BEFORE INSERT ON person_info_tab
FOR EACH ROW
BEGIN
SELECT kisi_id_seq.nextval INTO :new.kisi_id FROM dual;
END kisi_id_trg;

Umarım faydalı olur..

Sequence için daha detaylı bilgi:

http://omeracar.com.tr/sequence-nedir-nasil-kullanilir/

trigger için daha detaylı bilgi :

http://omeracar.com.tr/oracle-trigger-ve-ornekler/