السبت، 4 يناير 2014

اوركل 12c أكثر 17 مميزات هامة للمطورين 3/17

القيمة الافتراضية للعمود/ الحقل Default Value
السلام عليكم ورحمة الله وبركاته، اليوم نستكمل مشوارنا في التعرف على أهم ميزات ذلك العملاق المدعو Oracle 12c وكما ذكرنا سابقاً بأن حديثنا سيكون موجه لمطوري قواعد البيانات وليس مدراء قواعد البيانات.


إذاً أهلاً بكم من جديد، في هذه التدوينة سنتحدث بإذن الله عن القيمة الافتراضية حيث انه يفترض كل مطوري قواعد البيانات قد تعامل مع هذه الميزة في النسخ السابقة ل12c ، لكن كانت الإمكانيات محدودة ولتوضيح الميزة الجديدة دعونا نجري السناريو التالي، افترض بأنه يوجد جدول في قاعدة بياناتك على الشاكلة التالية:
CREATE TABLE account_tb
    (
    Seq                                   NUMBER(11),
    Account_Id                            NUMBER(11,0),
    Account_name                          VARCHAR2(80),
    email                                 VARCHAR2(50),
    SSN                                   NUMBER(15,0),
    Last_dept_Dt                          DATE,
    Insert_By                             VARCHAR2(30) DEFAULT USER,
    Insert_Dt                             DATE DEFAULT SYSDATE
    )

لاحظ معي عزيزي المبرمج ان القيمة الافتراضية للعمود Insert_By  هو عبارة عن المستخدم الذي قام بعملية إضافة السجل الى الجدول في قاعدة البيانات وكذلك Insert_Dt  يأخذ التاريخ والوقت تلقائياً وذلك في حال أن السجل المدخل لا يشمل قيم لهذه الأعمدة. ولا شك ان هذه الميزة سهلت كثيراً من عمل مبرمجي ومطوري قواعد البيانات لكن ! ماذا لو اردنا ان تكون القيمة الافتراضية للعمود Seq عبارة عن  Sequanceمثلاً ما قبل 12c كان يتم ذلك من خلال انشاء Trigger  على الجدول كتالي:
CREATE OR REPLACE TRIGGER acnt_trg
 BEFORE
  INSERT
 ON account_tb
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
begin
  select MY_SEQ.NEXTVAL into :NEW.SEQ FROM DUAL;
END;
/


لكن اليوم واعتباراً من اوركل 12c أصبح بالإمكان ان يتم إضافة الSequance  في Default value  للعمود كما في التالي:
CREATE TABLE account_tb
    (seq                      NUMBER(11,0) DEFAULT MY_SEQ.NEXTVAL ,
    account_id                     NUMBER(11,0),
    account_name                   VARCHAR2(80 BYTE),
    email                          VARCHAR2(50 BYTE),
    ssn                            NUMBER(15,0),
    last_dept_dt                   DATE,
    insert_by                      VARCHAR2(30 BYTE) DEFAULT USER,
    insert_dt                      DATE DEFAULT SYSDATE)
 بتأكيد يمكنك استغلال هذه الميزة في بناء Master/Detail Relation. ولكن عزيزي المبرمج يوجد شروط بسيطة قبل استخدام هذه الميزة وهي:
1.      يجب ان تكون Sequence  المستخدمة كقيمة افتراضية منشأة مسبقاً
CREATE SEQUENCE my_seq
  INCREMENT BY 1
  START WITH 1
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  NOCYCLE
  ORDER
  NOCACHE
 يمكنك مراجعة كيفية انشاء الSequence  فهي ليست موضوع نقاشنا في هذه التدوينة.
2.      يجب منح صلاحيات على Sequence  لUsers /  Roles الذين يملكون صلاحية ادخال على الجدول.
GRANT SELECT ON my_seq TO my_role

أيضاً يمكنك أن تعطي قيمة افتراضية في حال ان القيمة المدرجة على الجدول عبارة عن NULL Values  ولتوضيح الفكرة نتابع المثال التالي:
create table pay_tb (
             seq number(11) MY_SEQ.NEXTVAL,
             acc_id NUMBER(11),
             sal_val number default on null 0
             );

 وفي حال ادراج بيانات في الجدول كما في التالي :
insert into pay_tb (acc_id,sal_val) values (1, null);
insert into pay_tb (acc_id,sal_val) values (2, 2);

تكون نتيجة المدرجة في الجدول
select *
from pay_tb;
seq       acc_id          sal_val
---------- ---------     ---------     
1           1             0
2           2             2


وصل بنا قطار العلم ان نهاية هذه المحطة، نراكم في المحطة التالية وهي Longer Varchar2 ان كان لنا في العمر بقية. الى ذلك الوقت دمتم بحفظ الله ورعايته.

ليست هناك تعليقات: