13. Объектілік типтер


Объектілік тип дегеніміз мәліметтердің құрылымын немесе ішкі программаны инкапсуляция жасайтын біріктірілген жүйе.

Объектілік типтегі мәліметтердің құрылымында қолданылатын айнымалылардыатрибуттар немесе объектілік типтің айнымалысы деп атайды. Объектнің күйін анықтайтын функция мен процедуралар әдістер деп аталады.

Объектілік типтің айнымалысын жариялау барысында атрибуттары және әдістері бар объект құрылады, олар оның типін анықтайды.

объектілік тип жайындағы ақпарат мәліметтер базасында сақаталады.

Объектілік типтерді қолданудың артықшылығ ретінде келесі мүмкіндіктерді келтіруге болады:

  • объектілік типтерді қолдану PL/SQL блогындағы деректердің басқару кодын араластырып жіберуге мүмкіндік береді;
  • объектілік тип объектінің құрылымына деректермен жұмыс істеудің өзіндік әдістерін қолдану арқылы қол жетімдікке мүмкіндік бермейді;
  • объектілік типтер объектілі бағытталған программалау тілінің класстары арқылы жақсы жүзеге асады.

Объектілік типтің спецификациясы және денесі

Объектілік тип екі бөліктен тұрады: спецификация және дене.

Тип спецификациясы клиенттік қосымшада қол жетімді. Тип денесі жасырын, бірақ құрушы деректер базасында әдістерді жүзеге асыруды өзгертуге тура келеді.

Тип спецификациясы CREATE TYPE операторы арқылы құрылады, ол келесі формальды бейнеленулерден тұра алады:

CREATE [OR REPLACE] TYPE [schema .]

type_name

{ { IS | AS } OBJECT }

[ { attribute datatype

[sqlj_object_type_attr] } ] |

{ [ {[[[NOT] OVERRIDING]

[[NOT] FINAL] [[NOT] INSTANTIABLE]]

{ { MEMBER | STATIC }

{ procedure_spec | function_spec } |

{{ MAP | ORDER } MEMBER function_spec}}}]

.,:}

[[NOT] FINAL] [[NOT] INSTANTIABLE];

Функцияның анықталуы (function_spec) былайша көрсетіледі

FUNCTION name (parameter datatype .,:)

{ RETURN datatype }

Процедураның анықталуы (procedure_spec) келесідей көрсетіледі

PROCEDURE name (parameter datatype .,:)

Типтің денесі CREATE TYPE BODY операторы арқылы құрылады, ол келесі формальды бейнеленулерден тұра алады:

[CREATE TYPE BODY type_name {IS | AS}

{ {MAP | ORDER}

MEMBER function_body;

| MEMBER {procedure_body |

function_body};}

[MEMBER {procedure_body |

function_body};]... END;]

объектілік типті құру екі деңгейде жүзеге асады: алдымен CREATE TYPE операторы арқылы тип спецификациясы құрылады, сосын CREATE TYPE BODY операторы арқылы тип денесі құрылады.

Мысалы:

- объектілік типтіқұру

CREATE TYPE MyT AS OBJECT (

r1 REAL, - тип атрибуттары

r2 REAL,

MEMBER FUNCTION plus (x MyT)

RETURN MyT

);

CREATE TYPE BODY MyT AS

MEMBER FUNCTION plus (x MyT)

RETURN MyT IS

BEGIN

RETURN MyT (r1 + x.r1,

r2 + x.r2);

END plus;

END;

- объектілік типке айнымалыны қолдану:

DECLARE- Создается объект с1 типа MyT

с1 MyT;

BEGIN

- конструкторды шақыру

с1 := MyT (1,1);

END;

объектілік тип атрибутына келесі шектеулер қойылады:

  • атрибут типі ретінде Oracle деректер типінің кез келгені бола алады, оның ішіне LONG, LONG RAW, NCHAR, NCLOB, NVARCHAR2, ROWID, BOOLEAN, PLS_INTEGER, RECORD, REF CURSOR, %TYPE и %ROWTYPE, сонымен қатар PL/SQL пакетінде анықталған типтер кірмейді;
  • атрибутты жариялау барысында оны DEFAULT кілттік сөзін немесе меншіктеу операторын қолдану арқылы инициализациялауға болады;
  • атрибутқа NOT NULL шектеуі қойыла алмайды.

Атрибут типі ретінде кез келген мүмкін тип бола алады немесе басқа объектілік тип, бқл кезде ондай объектілік типтерді енгізілген объектілік тип деп те атаймыз

Объектілік типтер кестелерді құру ьарысында аймақтар типі ретінде қолданылуы мүмкін.

Мысалы:

CREATE TYPE typ1 AS OBJECT (a1 NUMBER,

MEMBER FUNCTION getf1 RETURN NUMBER);

- :

- таблица құру

CREATE TABLE tbl1(col typ1);

- :

- объектілік типтің әдісін шақыру

SELECT col.getf1() FROM tbl1;

Объектілік типтің спецификациясы әрбір жалпы қол жетімдігі бар әдіске хабарламасы бар болуы қажет.

объектілік типтің әдісінің атының алдынан Объектілік типтің спецификациясы және дененің бейеленуі барысында әрқашан да MEMBER кілттік сөзі қолданылады.

Атрибуттардың квалификациясы үшін объектілік тип әдістерінде SELF кіттік сөзін қолдануға болады, оны берліген объектіге сілтеме ретінде қарастыруға болады. Бірақ та PL/SQL тілінің синтаксисі атрибуттардың міндетті квалификациясын талап етпейді. SELF параметрі функциядағы немесе процедурадағы бірінші параметр ретінде көрсетіле алады. Егер SELF параметрі көрсетілмесе, онда функция үшін IN опциясымен айқындау қажет болады (кіруші параметр), ал процедуралар үшін - IN OUT опциясы арқылы (кіру шығу параметрлері).

Объектілік тип жегу әдістерінен тұруы мүмкін.

Объектілік типтің мәнін салыстыру

Скалярлы типтер мәнінен қарағанда объектілік типтер мәндері үшін бірдей салыстыру ережесі жоқ. PL/SQL тілінде MAP және ORDER кілттік сөздері анықталған, ол объектілік типтің мәнін салыстырудың ережелерінен тұратын әдісті жасауға мүмкіндік береді. Объектілік тип тек бір ғана әдістен тұра алады, ол берілген типтің экземплярларын салыстыру үшін қажет. MAP-әдіс немесе ORDER-әдіс.

объектілік типтің MAP-әдісінің мәніне байланысты хештеу функциясын қарастыруға болады.

ORDER-әдіс – бұл екі параметрлі функция, скалярлы типтегі мәндерді қайтарады (DATE, NUMBER, VARCHAR2, CHARACTER немесе REAL), бірінші параметрді салыстыру барысында әрқашан SELF тең, ал екінші параметр осы типтегі объектіге сілтеме жасайды.

SQL-операторларда объектілік типтердің екі мәндерін эквиваленттілікке салыстыруға болады.

Объектілік типтің конструкторлары

Oracle бастапқы мән бойынша әрбір объектілік тип үшін конструктор құрады, ол бір атты тип болып саналады.

Конструктор объектілік типтің экземплярын қайтару үшін және инициализациялану үшін қажет. Объектінің инициализациялануы барысында конструктор параметр тізімімен қоса шақырылады, оларды жариялану тізімі бойынша атрибуттар анықтайды.

SQL тілінің пакеттері

Пакетті құру

Пакет - PL/SQL дің логикалық байланысқан типтерін, мәліметтерін және ішкі программаларды біріктіреді. Пакет екі бөліктен тұрады: Пакет спецификациясы және пакеттің денесі.

Пакет спецификациясында қол жетімді типтер, айнымалылар, тұрақтылар, шығарып тастаулар курсорлар және ішкі программалар жарияланады.

Пакет денесінде курсорлардың анықтамасы мен ішкі программаларды жүеге асыру жатады. Пакет денесінде жарияланатын барлық элементтер қосымша үшін көрінбейді. Бұл қолданушыдан ішкі программаны жүзеге асырудың бөліктерін сақтауға мүмкіндік береді.

Пакет спецификациясын анықтау CREATE PACKAGE операторы арқылы орындалады және олар келесі формальды бейнеленулерден тұра алады:

- Спецификация (көрінетін бөлік)

CREATE PACKAGE name AS

- жалпы қол жетімді типтерді жариялау

- және айнымалыларды

- ішкі программалардың спецификациясы

END [name];

Пакет денесін анықтау CREATE PACKAGE BODY операторы арқылы анықталады. Ол кішкене қысқартулары бар келесі формальды бейнеленулерден тұрады:

- пакет денесі (жасырын бөлік)

CREATE PACKAGE BODY name AS

- Локальды типтерді жариялау

- және айнымалыларды

- ішкі программаның денесі

END [name];

Мысалы:

- пакет спецификациясы

CREATE PACKAGE tbl_rows AS

TYPE RecTBL1 IS RECORD

(tbl1f1 INTEGER, tbl1f2 REAL);

PROCEDURE insert_tbl1

(f1 INTEGER, f2 REAL);

END tbl_rows;

- Тело пакета

CREATE PACKAGE BODY tbl_rows AS

PROCEDURE insert_tbl1

(f1 INTEGER, f2 REAL) IS

BEGIN

INSERT INTO tbl1

VALUES (f1,f2);

END insert_tbl;

END tbl_rows;

Жалпы қол жетімді пакет элементтеріне типке, айнымалыға және әдістерге ішкі программаларда немесе OCI қосымшаларында сақталатын триггерлер арқылы сілтемелер жасауға болады. Ол үшін келесі синтаксисті қолданады: package_name.item_name.

Пакеттік процедураны енгізілген SQL ден шақырып алу PL/SQL анонимді блогында жүзеге асырылуы мүмкін, оның орындалуы үшін SQL-оператор EXECUTE қолданылады

Мысалы:

EXEC SQL EXECUTE

BEGIN

tbl_rows.insert_tbl1(1, 200);

END;

Подпрограммалар

Ішкі программалар дегеніміз PL/SQL аты бар блоктар, олардың параметрлері бола алады.

PL/SQL тілі ішкі программаларды процедуралар, және PL/SQL функциялары секілді құруға мүмкіндік береді.

Ішкі программалар PL/SQL кез келген блогында, ішкі программасында немесе пакетінде жариялана алады. Кез келген функция немесе процедура оның қолданылуына дейін жариялануы қажет. Мұндай жағдайда егер ішкі программаға келесі басқа бір ішкі программаны қолдану қажет болса, онда алдын ала хабарлау механизмін қолданған жөн. Осы кезде алдын ала хабарланатын ішкі программа тек қана спецификациядан тұрады, ал ішкі программаның толық жариялануы төменде қарапайым синтаксистің сәйкестігі арқылы жүзеге аса алуы мүмкін.

Ішкі программалар пакетін сырттай шақыру үшін ол CREATE PACKAGE операторы арқылы анықталатын пакет спецификациясында жарияланған болуы керек.

Өздік ішкі программаны шақыру үшін ол деркетер базасында сақталған болуы керек. Мұндай ішкі программаларды процедуралармен сақталынушы немесе функциямен сақталынушы деп атайды. Оларды құру үшін CREATE PROCEDURE және CREATE FUNCTION SQL-операторлары қолданылады.

Процедураны анықтау келесіформальды бейнеленуден тұрады:

PROCEDURE name

[(parameter[, parameter, ...])]

IS

[local declarations]

BEGIN

executable statements

[EXCEPTION exception handlers]

END [name];

Параметрлер параметр тізімінде былайша анықталады:

parameter_name [IN | OUT | IN OUT]

datatype [{:= | DEFAULT} expression]

Процедура мен функцияларды жариялау барысында қолданылатын параметрлер формальды параметрлер деп, ал шақыру кезіндегі – фактілік параметрами деп аталады

PL/SQL тілі фактілік параметрлердің саны формальді параметрлер санына қарағанда аз мүмкіндіге береді. Мұндай жағдайда мәндердің бастапқы мәндері қолданылады, олар параметрлердің жоқ мәндері үшін болуы қажет.

Формальды және фактілік параметрлер арасындағы сәйкестікті анықтау үшін нотацияның екі типі көрсетілген:

  • позициялық;
  • аты бар.

Позициялық нотация барысында формальды және фактілік параметрлер бір бірімен сәйкес келуі қажет.

Аты бар нотация кезінде параметрлерді көрсету тізімі ешқандай мән бермейді, бірақ параметр мәнінің алдынан формальды параметр аты және => символы көрсетіледі. Параметр тізімі нотацияның екі бірдей типін бір уақытта ұстай алады, бірақ аты бар нотация тек қана тізімнің артында орналасады.

Процедура екі бөліктен тұра алады:

  • спецификация, PROCEDURE кілттік сөзінен басталады және процедураның атымен немесе параметр тізімімен аяқталады;
  • процедураның денесі, IS кілттік сөзімен басталады жіне END кілттік сөзімен аяқталады.

Процедура денесі, PL/SQL тің кез келген блогы сияқты хабарламалар секциясынан, орындалатын код секциясынан және шығарып тастауларды өңдеудің міндетті емес секциясынантұра алады.

Функцияны анықтау келесі формальды бейнеленуден тұра алады:

FUNCTION name

[(parameter[, parameter, ...])]

RETURN datatype

IS

[local declarations]

BEGIN

executable statements

[EXCEPTION

exception handlers]

END [name];

Параметрлер параметр тізімінде келесі түрде анықталады:

parameter_name [IN | OUT | IN OUT]

datatype [{:= | DEFAULT} expression]

Мысалы:

FUNCTION fun1 (f1 REAL, f2 REAL)

RETURN BOOLEAN IS

min_f1 REAL :=0;

max_f1 REAL :=1;

BEGIN

SELECT ff1min, ff2max

INTO min_f1, max_f1

FROM tbl1

WHERE ff2 = f2;

RETURN (f1 >= min_f1)

AND (f2 <= max_f1);

EXCEPTION

WHEN NO_DATA_FOUND THEN

INSERT INTO tbl2

VALUES (min_f1, max_f1);

RETURN FALSE;

END fun1;

PL/SQL тілі жегу ішкі программаларын құруға мүмкіндік береді. Олардың аттары бірдей болады, бірақ формальды параметрлер тізімі әртүрлі болады. Жегу функцияларының параметрлері кем дегенде келесі белгілердің бірімен ерекшеленуі қажет: типі бойынша, саны бойынша, параметрлердің тізбектелуінің тізімі бойынша.

Жегу ішкі программаларын әртүрлі типтер айнымалыларына бір қызметтің жүзеге асырылуы барысында қолдануға болады. Жегу ішкі программалары үшін компилятор берілген фатілік параметрлермен сәйкес келетін ішкі программаны берілген блок ішіндегі барлықжегу ішкі программаларын қарастырып шыққанға дейін қарайды. Егер жегу ішкі программасы берілген блокта жоқ болатфын болса ғана компилятор сыртқы блоктан қарайды.

Рекурсивті және өзара рекурсивті ішкі программалар шақыруы

Рекурсивті шақыру дегеніміз осы ішкі программаның денесінен ішкі программаны шақыру.

Әрбір рекурсивті шақыруда:

  • Барлық элементтердің ішкі программада көрсетілген жаңа экземплярлары, соның ішінде параметрлер, айнымалылар, курсорлар немесе шығарып жіберулер құрылады;
  • создается свой экземпляр SQL-оператора.

Рекурсивті шақырулардың мысалы ретінде Фибоначчи (1, 1, 2, 3, 5, 8, 13, 21, ...) тізбегін құруды қарастырайық, онда әрбір элемент алдындағы екі элементтің суммасы ретінде алынады.

Келесі fibonati1 функциясы Фибоначчи тізбегінің қолданылуын рекурсияны пайдалану арқылы шешеді:

FUNCTION fibonati1 (n POSITIVE)

RETURN INTEGER IS

BEGIN

IF (n = 1) OR (n = 2) THEN

RETURN 1;

ELSE

RETURN fibonati1 (n-1) +

fibonati1 (n-2);

END IF;

END fibonati1;

Рекурсивті әдістің орнына итерациялық әдісті де қолдануға болады. Ол азырақ көрікті , бірақ аз жадты қажет етеді және тезірек орындалады.

Сонымен, келесі fibonati2 функциясы Фибоначчи тізбегін итерационды әдім арқылы жүзеге асырады:

FUNCTION fibonati2 (n POSITIVE)

RETURN INTEGER IS

pos1 INTEGER := 1;

pos2 INTEGER := 0;

sum INTEGER;

BEGIN

IF (n = 1) OR (n = 2) THEN

RETURN 1;

ELSE

sum := pos1 + pos2;

FOR i IN 3..n LOOP

pos2 := pos1;

pos1 := sum;

sum := pos1 + pos2;

END LOOP;

RETURN sum;

END IF;

END fibonati2;

PL/SQL тілі сәйкестік рекурсивті шақыруларды жүзеге асыруға мүмкіндік бере алады. Олардың кезінде ішкі программалар бір бірін тура немесе орта арқылы шақырады.

Сыртқы процедуралар

Сыртқы процедураларды қолдану сервердің қызмет етуін үлкен көлемде кеңейтеді. Ол программаны шақыру үшін басқа программалау тілінде C++ немесе Pascal тілінде DLL-кітапханалар ретінде құрылған интерфейс ұсынады.

PL/SQL блогын орындау барысында динамикалық түрде DLL-кітапханалар жүктеледі және ішкі процедураны шақыру PL/SQL ішкі программалары ретінде шақырылады. Сыртқы процедуралар әрқашан да жеке процессте орындалады.

Ішкі процедураларды шақыруды :

  • анонимді PL/SQL блоктарынан;
  • объектілік типте жарияланған әдістерден
  • сақталынған немесе пакеттік ішкі программалардан;
  • деректер базасының триггерлерінен;
  • тек қана пакетті ішкі программалар үшін шақырылатын SQL-оператордан

Ішкі функцияны қолдану үшін алдымен қолданылатын DLL-кітапхананы CREATE LIBRARY library_name {IS | AS} 'file_path'; операторын қолдану арқылы анықтап алу керек. Содан кейін ішкі процедураны PL/SQL процедурасын көрсету процедураның орналасқан жерін, оны шақырудың әдісін және берілетін параметрлердің тізімін беру арқылы тіркеу керек.

Егер DLL-кітапханасы c_lib.dll f1_ext функциясынан тұратын болса және ол Сда int c_ext_f1(int x_val, int y_val); ретінде анықталған болса, онда осы ішкі процедураны тіркейтін PL/SQL reg_ext_f1 ішкі программасы келесі түрде жазыла алады:

CREATE FUNCTION reg_ext_f1(

x BINARY_INTEGER, y BINARY_INTEGER)

RETURN BINARY_INTEGER AS EXTERNAL

LIBRARY c_lib

- Имя внешней функции

NAME "c_ext_f1"

LANGUAGE C;

Ішкі функция DLL-кітапханасын PL/SQL анонимді блогынан шақыру үшін PL/SQL шақыру функциясын жүзеге асырса болғаны, ол ішкі функция ретінде тіркелген болуы керек.

Мысалы:

DECLARE

var1 BINARY_INTEGER;

x BINARY_INTEGER;

y BINARY_INTEGER;

BEGIN

x:=1; y:=2;

- Вызов внешней функции f1_ext:

var1 := reg_ext_f1(x, y);

END;