آموزش PL/SQL قسمت شانزدهم – برنامه نویسی شی گرا در اوراکل PL/SQL

در PL/SQL با استفاده از نوع (OBJECT (OBJECT TYPE می توان برنامه نویسی شی گرا یاOBJECT ORIENTED انجام داد. در OBJECT واسط ها و جزییات پیاده سازی از هم جدا می شوند و در دیتابیس ذخیره گردند. این روش، زمان و هزینه پیاده سازی برنامه های پیچیده را کاهش می دهد و خاصیت انتزاع (ABSTRACTION) و ترکیبی بودن را برقرار می کند.

خاصیت ترکیبی:

نوع OBJECT همانند نوع داده رکورد، ترکیبی از عناصر مختلف است با این تفاوت که عملیات قابل انجام روی نوع OBJECT از پیش تعریف شده نیست و توسط کاربر تعریف می شود.

خاصیت انتزاع:

یک OBJECT از لحاظ مخفی بودن جزییات، همانند یک پروسیجر می ماند ولی نمی توان در بلاک برنامه PL/SQL، نوع OBJECT تعریف نمود بلکه می بایست در دیتابیس اوراکل تعریف و ذخیره شود.

 

نوع OBJECT چیست؟

نوع OBJECT مجموعه ای از نوع داده ها با ساختار مختلف به همراه تابع و پروسیجر است. به متغییرهایی که ساختار داده در OBJECT را تشکیل می دهند ATTRIBUTE می گویند و توابع و پروسیجرها که خصوصیات رفتاری یک OBJECT را مشخص می کنند METHOD نامیده می شوند. برای مثال اگر انسان را یک OBJECT در نظر بگیریم، سن، وزن و جنسیت او به عنوان ATTRIBUTE و خوردن، آشامیدن و خوابیدن به عنوان METHOD درنظر گرفته می شوند.

فرض کنید نوع OBJECT کارمندان با ATTRIBUTE و METHODهای مختلف تعریف و در دیتابیس ذخیره می شود. بنابراین گروه های مختلف کارمندان بر اساس مشخصات و عملیات مورد نیاز فقط قسمتی از ویژگی های این OBJECT را استفاده خواهند کرد.

بعد از تعریف و ذخیره سازی نوع OBJECT در دیتابیس اوراکل، در زمان اجرای برنامه می توان به تعداد دلخواه INSTANCE از روی آن OBJECT ساخت و از آنها استفاده نمود.

مثال: ساختن دو INSTANCE از نوع OBJECT کارمندان.

 

ساختار OBJECT

یک OBJECT همانند پکیج از دو قسمت مشخصات (SPEC) و بدنه تشکیل شده است. در قسمت SPEC واسط های PUBLIC تعریف می شوند که شامل ATTRIBUTEها و نام METHODهایی است که عملیات مختلف روی داده ها انجام می دهند. در قسمت بدنه نیز METHODها (پروسیجر و تابع) تعریف می شوند. بنابراین تمام اطلاعاتی که در اختیار برنامه کاربران قرار می گیرد در SPEC تعریف شده است.

مثال:

CREATE  OR REPLACE TYPE Complex AS OBJECT (

   rpart REAL,  — attribute

   ipart REAL,

   MEMBER FUNCTION plus (x Complex) RETURN Complex,  — method

   MEMBER FUNCTION less (x Complex) RETURN Complex,

   MEMBER FUNCTION times (x Complex) RETURN Complex,

   MEMBER FUNCTION divby (x Complex) RETURN Complex

);

 

CREATE TYPE BODY Complex AS

   MEMBER FUNCTION plus (x Complex) RETURN Complex IS

   BEGIN

      RETURN Complex(rpart + x.rpart, ipart + x.ipart);

   END plus;

 

   MEMBER FUNCTION less (x Complex) RETURN Complex IS

   BEGIN

      RETURN Complex(rpart – x.rpart, ipart – x.ipart);

   END less;

 

   MEMBER FUNCTION times (x Complex) RETURN Complex IS

   BEGIN

      RETURN Complex(rpart * x.rpart – ipart * x.ipart,

                     rpart * x.ipart + ipart * x.rpart);

   END times;

 

   MEMBER FUNCTION divby (x Complex) RETURN Complex IS

      z REAL := x.rpart**2 + x.ipart**2;

   BEGIN

      RETURN Complex((rpart * x.rpart + ipart * x.ipart) / z,

                     (ipart * x.rpart – rpart * x.ipart) / z);

   END divby;

END;

نکته: در یک OBJECT:

-نمی توان CONSTANT، CURSOR ، EXCEPTION و TYPE تعریف و استفاده نمود.

-حداقل باید یک ATTRIBUTE تعریف شود ولی می توان حداکثر تا 1000 مورد تعریف کرد.

-استفاده از METHOD و قسمت بدنه اختیاری است.

نکته: هر ATTRIBTE همانند یک متغییر باید نام واحد در حوزه آن OBJECT داشته باشد و نوع داده آن می تواند از نوع های مختلف باشد به غیر از:

-LONG و LONGROW

-ROWID و UROWID

-BINARY_INTEGER، BOOLEAN، RECORD ، REF_CURSOR ، %TYPE و %ROWTYPE

نوع داده هایی که در داخل یک پکیج تعریف شده اند.-

نکته: در زمان تعریف ATTRIBUTE نمی توان از مقدار پیش فرض یا initialize و NULL استفاده نمود.

 

دسترسی به METHODها و ATTRIBUTEهای OBJECT

برای دسترسی به اجزای OBJECT ابتدا باید یک INSTANCE از آن OBJECT ساخته شود و مقدارهای مناسب به اجزا اختصاص داده شود. سپس با استفاده از نام آن INSTANCE و علامت . می توان به METHODها یا ATTRIBUTEهای آن OBJECT دسترسی داشت.

مثال:

CREATE OR REPLACE TYPE address AS OBJECT

(house_no varchar2(10),

street varchar2(30),

city varchar2(20),

state varchar2(10),

pincode varchar2(10)

);

/

DECLARE

residence address;

BEGIN

residence := address(‘103A’, ‘M.G.Road’, ‘Jaipur’, ‘Rajasthan’,’201301′);

dbms_output.put_line(‘House No: ‘|| residence.house_no);

dbms_output.put_line(‘Street: ‘|| residence.street);

dbms_output.put_line(‘City: ‘|| residence.city);

dbms_output.put_line(‘State: ‘|| residence.state);

dbms_output.put_line(‘Pincode: ‘|| residence.pincode);

END;

/

خروجی:

House No: 103A

Street: M.G.Road

City: Jaipur

State: Rajasthan

Pincode: 201301

PL/SQL procedure successfully completed.

 

نکته: METHOD هایی که به منظور دستکاری ATTRIBUTEهای یک OBJECT استفاده می شوند MEMBER نامیده می شوند.

نکته: توابعی که یک OBJECT جدید برمی گردانند CONSTRUCTOR نامیده می شوند. هر OBJECT یک CONSTRUCTOR از پیش تعریف شده دارد که نام آن برابر با نام OBJECT است. در مثال قبل نام تابع CONSTRUCTOR برابر با address() است:

residence := address(‘103A’, ‘M.G.Road’, ‘Jaipur’, ‘Rajasthan’,’201301′);

 

 

METHODهای مقایسه ای

با استفاده از METHODهای مقایسه ای می توان OBJECTهای مختلف را به روش دلخواه مقایسه کرد. METHODهای مقایسه ای عبارتند از:

1.MAP METHOD:

فرض کنید یک OBJECT برای چهارضلعی ها تعریف شده است. اگر بخواهیم اندازه دو NSTANCE از این OBJECT را مقایسه کنیم باید با استفاده از تابع MAP مساحت هر INSTANCE را با INSTANCE دیگر مقایسه کنیم.

مثال: برای چهارضلعی یک OBJECT تعریف می کنیم:

CREATE OR REPLACE TYPE rectangle AS OBJECT

(length number,

width number,

member function enlarge( inc number) return rectangle,

member procedure display,

map member function measure return number

);

/

در قسمت بدنه تابع های MAP و MEMBER تعریف می شود.

CREATE OR REPLACE TYPE BODY rectangle AS

MEMBER FUNCTION enlarge(inc number) return rectangle IS

BEGIN

return rectangle(self.length + inc, self.width + inc);

END enlarge;

MEMBER PROCEDURE display IS

BEGIN

dbms_output.put_line(‘Length: ‘|| length);

dbms_output.put_line(‘Width: ‘|| width);

END display;

MAP MEMBER FUNCTION measure return number IS

BEGIN

return (sqrt(length*length + width*width));

END measure;

END;

/

ایجاد INSTANCE و استفاده از METHODها:

DECLARE

r1 rectangle;

r2 rectangle;

r3 rectangle;

inc_factor number := 5;

BEGIN

r1 := rectangle(3, 4);

r2 := rectangle(5, 7);

r3 := r1.enlarge(inc_factor);

r3.display;

IF (r1 > r2) THEN — calling measure function

r1.display;

ELSE

r2.display;

END IF;

END;

/

در این مثال با استفاده از تابع MEMBER به نام enlarge مشخصات INSTANCE شماره 3 بر اساس INSTANCE شماره 1 تعریف می شود و در زمان مقایسه بین INSTANCE شماره 1 با شماره 2 از تابع  MAP استفاده می شود.

خروجی:

Length: 8

Width: 9

Length: 5

Width: 7

PL/SQL procedure successfully completed.

 

 

2.ORDER METHOD

در تابع ORDER می توان از یکسری منطق های داخلی نیز استفاده نمود تا دو INSTANCE را مقایسه کنیم.

مثال: برای چهارضلعی یک OBJECT تعریف می کنیم.

CREATE OR REPLACE TYPE rectangle AS OBJECT

(length number,

width number,

member procedure display,

order member function measure(r rectangle) return number

);

/

در قسمت بدنه، توابه MEMBER و ORDER رل تعریف می کنیم:

CREATE OR REPLACE TYPE BODY rectangle AS

MEMBER PROCEDURE display IS

BEGIN

dbms_output.put_line(‘Length: ‘|| length);

dbms_output.put_line(‘Width: ‘|| width);

END display;

ORDER MEMBER FUNCTION measure(r rectangle) return number IS

BEGIN

IF(sqrt(self.length*self.length + self.width*self.width)>

sqrt(r.length*r.length + r.width*r.width)) then

return(1);

 ELSE

return(-1);

END IF;

END measure;

END;

/

ایجاد INSTANCE و مقایسه آنها:

DECLARE

r1 rectangle;

r2 rectangle;

BEGIN

r1 := rectangle(23, 44);

r2 := rectangle(15, 17);

r1.display;

r2.display;

IF (r1 > r2) THEN — calling measure function

r1.display;

ELSE

r2.display;

END IF;

END;

/

خروجی

Length: 23

Width: 44

Length: 15

Width: 17

Length: 23

Width: 44

 

نکته: در توابع MEMBER می توان از یک پارامتر داخلی به نام SELF استفاده نمود که اشاره به همان INSTANCE که تابع MEMBER از آن فراخوانی شده است می کند. در مثال قبل از SELF استفاده شده است.

 

وراثت در OBJECTها

می توان از روی OBJECTهایی که وجود دارند یک OBJECT فرزند ایجاد کرد به شرطی که OBJECT اصلی به صورت NOT FINAL تعریف شده باشد.

مثال: ایجاد OBJECT جهارضلعی به صورت NOT FINAL:

CREATE OR REPLACE TYPE rectangle AS OBJECT

(length number,

width number,

member function enlarge( inc number) return rectangle,

NOT FINAL member procedure display) NOT FINAL

/

قسمت بدنه:

CREATE OR REPLACE TYPE BODY rectangle AS

MEMBER FUNCTION enlarge(inc number) return rectangle IS

BEGIN

return rectangle(self.length + inc, self.width + inc);

END enlarge;

MEMBER PROCEDURE display IS

BEGIN

dbms_output.put_line(‘Length: ‘|| length);

dbms_output.put_line(‘Width: ‘|| width);

END display;

END;

/

تعریف یک OBJECT فرزند به نام tabletop :

CREATE OR REPLACE TYPE tabletop UNDER rectangle

(

material varchar2(20),

OVERRIDING member procedure display

)

/

قسمت بدنه:

CREATE OR REPLACE TYPE BODY tabletop AS

OVERRIDING MEMBER PROCEDURE display IS

BEGIN

dbms_output.put_line(‘Length: ‘|| length);

dbms_output.put_line(‘Width: ‘|| width);

dbms_output.put_line(‘Material: ‘|| material);

END display;

/

 

ایجاد INSTANCE و استفاده از tabletop:

DECLARE

t1 tabletop;

t2 tabletop;

BEGIN

t1:= tabletop(20, 10, ‘Wood’);

t2 := tabletop(50, 30, ‘Steel’);

t1.display;

t2.display;

END;

/

خروجی:

Length: 20

Width: 10

Material: Wood

Length: 50

Width: 30

Material: Steel

PL/SQL procedure successfully completed.

نکته: اگر یک OBJECT با عبارت  NOT INSTANTIABLE تعریف شود، نمی توان INSTANCE از روی آن ساخت بلکه باید برای آن OBJECT فرزند تعریف کرد و از آن استفاده نمود.

مثال: تعریف OBJECT به صورت NOT INSTANTIABLE:

CREATE OR REPLACE TYPE rectangle AS OBJECT

(length number,

width number,

NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)

NOT INSTANTIABLE NOT FINAL

/

نکته: توجه شود که در برخی متون به INSTANCE که از روی OBJECT ساخته می شود OBJECT نیز می گویند.

Comments (2)

  1. درود بر شما
    من احتیاج به راهنمایی شما دارم.من در حال تهیه یک Trigger هستم که بتواند دسترسی Remote به پایگاه داده را کنترل نماید. تا آنجا که IP را چک کند ، درست کار می‌کند. اما آنجا که می‌خواهم جلو دسترسی کاربر system اراکل را از آن IP بگیرم ، موفق نمی‌شوم. یعنی حتی اسم کاربر system در متغییر USER که در Trigger مورد استفاده است ، قرار نمی‌گیرد تا بتوانم جلوی Connect شدنش را بگیرم.هدف از این Trigger اینست که از یک IP خاص ، بتوان با یک کاربر معمولی که دسترسی‌های محدود دارد ، به پایگاه داده Connect شد. یعنی حتی نتوان از آن IP با کاربرهای sys و system به پایگاه داده connect شد.(حتی اگر پسورد را هم داشته باشیم)

    1. سلام بر شما دوست عزیز
      triggerهای از نوع login فقط می توانند جلوی login کردن کاربرانی را بگیرند که مجوز سیستمی “administer database trigger” را ندارند یا از آنها revoke شده باشد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *