القيمة
الافتراضية للعمود/ الحقل 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 ان كان لنا في العمر بقية. الى ذلك الوقت
دمتم بحفظ الله ورعايته.