Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu

Similar documents
Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Versionare - GIT ALIN ZAMFIROIU

Procesarea Imaginilor

Metrici LPR interfatare cu Barix Barionet 50 -

Modalitǎţi de clasificare a datelor cantitative

CERERI SELECT PE O TABELA

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

INTEROGĂRI ÎN SQL SERVER

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

R O M Â N I A CURTEA CONSTITUŢIONALĂ

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL

Subiecte Clasa a VI-a

GHID DE TERMENI MEDIA

ISBN-13:

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Mecanismul de decontare a cererilor de plata

CERERI SELECT PE MAI MULTE TABELE

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

Baze de date - Lucrare de laborator 3 -

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea:

Olimpiad«Estonia, 2003

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

5.1 Definirea datelor în SQL

Propuneri pentru teme de licență

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

Documentaţie Tehnică

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

Universitatea George Bariţiu, Braşov

Interogarea (query), este operaţia prin care se obţin datele

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

Lucrarea de laborator nr. 4

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

Auditul financiar la IMM-uri: de la limitare la oportunitate

PROIECTAREA ALGORITMILOR

:= 950; BEGIN DELETE FROM

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

Universitatea Politehnica Bucureşti Facultatea de Automatică şi Calculatoare Departamentul de Automatică şi Ingineria Sistemelor LUCRARE DE LICENŢĂ

Reţele Neuronale Artificiale în MATLAB

Ce este o BAZA DE DATE?

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte

The First TST for the JBMO Satu Mare, April 6, 2018

M C I O H L BAZE DE CUNOŞTINŢE A H E O L N S I S T E M E D E R E P R E Z E N A R E Ş I P R O C E S A R E A A C U N O Ş T I N Ţ E L O R

Cap.5 Normalizarea relaţiilor

Baze de date distribuite și mobile

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

UNIVERSITATEA DIN CRAIOVA FACULTATEA DE ELECTROMECANICĂ CATEDRA DE ACŢIONĂRI ELECTRICE. Şef lucrări dr. ing. Cătălin CONSTANTINESCU BAZE DE DATE

Mulțumim anticipat tuturor acelora care vor transmite critici/observații/sugestii

INTRODUCERE... 2 SCENARIUL... 3 ERD (DIAGRAMA ENTITATE RELAȚIE)... 6 MAPARE... 8 REALIZARE APLICAȚIE BIBLIOGRAFIE...

Subinterogari SELECT salariul FROM angajaţi WHERE nume= Ionescu SELECT nume, prenume FROM angajaţi WHERE salariul>s

Cuprins Cuprins Bănci şi baze de date Etapele de realizare a unei bănci de date... 17

Laborator 2. Definirea tablourilor şi a funcţiilor (în linia de comandă) în Matlab 7.0

Metoda de programare BACKTRACKING

5.2 Interogări în SQL

La fel ca şi noţiunile de abstractizare şi încapsulare, ierarhizarea este un concept fundamental

Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

Update firmware aparat foto

1. Creaţi un nou proiect de tip Windows Forms Application, cu numele MdiExample.

PROIECT. La Baze de date. Evidența activității pentru o firmă IT. Îndrumător: ș. l. dr. ing. Mirela Danubianu. Efectuat de: Grigoriev Sergiu gr.

BAZE DE DATE Crearea, gestionarea şi exploatarea bazelor de date spaţiale

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

ADO.NET - note de curs pentru disciplina "Servere de date"

Macrocomenzi. Figura 1. Personalizarea barei de meniuri. Se va afișa fereastra din figura 2. Figura 2. Includerea tab ului Developer.

Tehnologia OLAP. Prep. Daniela-Ioana SANDU, prep. Elena POSDARIE Catedra de Informatica Economica, A.S.E. Bucuresti

Clase si obiecte. 1. Scopul lucrării. 2. Clase simple

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Modele de date utilizate în bazele de date pentru prelucrari grafice

Lucrarea Nr.1. Sisteme de operare. Generalitati

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router

În continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci.

UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

X-Fit S Manual de utilizare

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

Programarea rapidă a aplicaţiilor pentru baze de date relaţionale. Lorentz JÄNTSCHI

Proiectarea Sistemelor Software Complexe

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

IV. PROGRAMAREA ORIENTATĂ PE OBIECTE

EN teava vopsita cu capete canelate tip VICTAULIC

Itemi Sisteme de Operare

MODELUL UNUI COMUTATOR STATIC DE SURSE DE ENERGIE ELECTRICĂ FĂRĂ ÎNTRERUPEREA ALIMENTĂRII SARCINII

LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE

Transcription:

Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu Tipuri construite interne (build-in) Din faza iniţială a existenţei sale, SQL a permis utilizarea tipurilor atomice pentru definirea coloanelor, variabilelor şi parametrilor. Tot acolo a fost introdusă o clasă de tipuri de date numite tipuri construite. Acestea sunt tipuri definite de utilizator (UDT), tipuri referinţă, tipuri linie (rând), precum şi tipuri colecţie. Tipurile construite pot conţine mai mult decât o valoare. Din cele patru componente ale familiei tipurilor construite, ultimele două (tipurile rând şi tipurile colecţie) sunt interne (build-in), iar primele două (UDT şi referinţă) pot fi folosite de utilizator pentru a defini, prin extindere, tipuri noi, pe lângă cele interne. Tipuri linie (rând) În accepţiunea obişnuită folosită în contextul modelului relaţional, o linie (rând) este o colecţie nevidă de valori, în care tipul fiecărei valori corespunde unei definiţii de coloană dintr-o tabelă. După cum ştim, o tabelă relaţională convenţională (relaţie) este formată din linii (rânduri) cu proprietatea că fiecare valoare de coloană, în fiecare linie, trebuie să fie atomică, aceasta fiind definiţia FN1. Standardul SQL lărgeşte cerinţele FN1, prin introducerea tipului linie (rând), care admite ca o linie să conţină o altă linie, aceasta fiind introdusă ca o valoare de coloană. Se observă că tipul linie (rând) este asemănător cu structurile de înregistrare din limbajele de programare şi cu tipul struct din limbajul obiectual ODL. «persistent» Persoana Idp datanast prenume nume {disjunct, mandatory} «persistent» birouri (N:M) BirouArhitectura consiliere (N:1) «persistent» * * Idb * 0..1 «persistent» Arhitect membru membrual nume raspundede analistsist AnalistiSistematiza re status adresa tel functie * 1 * «persistent» avizează avizare Edificii * participare cod * nume getanalistsistematizare Inspectare getarhitect * create table birouarhitectura( idb varchar(10), 1

nume varchar(50) not null, adresa row (strada varchar(30), cladirea varchar(5), camera varchar(5)), analistsistematizare varchar(11) references arhitecti(idp), primary key (idb)); Constructorul de linie (rând) se foloseşte pentru a atribui valori câmpurilor unei linii. Valorile folosite de constructorul de linie pot fi o listă de valori, sau rezultatul unei interogări. În fiecare din aceste cazuri, tipurile valorilor trebuie să corespundă tipurilor de câmp folosite în definiţia tipului linie. Exemplu: insert into birouarhitectura values( BA101, Birou Arhitect Univ, row( Spaiul Independentei, Cladire centrala, cam 301 ), DA110 ); În comanda de mai sus, adresa biroului de arhitectură este reprezentată ca o coloană în tabelă, însă această adresă este o valoare nonatomică formată din trei valori de şiruri de caractere separate. De asemenea, DA are sensul de Director Arhitect. Valorile unui tip (rând) pot fi extrase folosind notaţia cu punct pentru a realiza accesul la câmpurile individuale care sunt părţi ale coloanei. De exemplu: select b.adresa.strada, b.adresa.cladirea, b.adresa.camera from birouarhitectura b where b.nume = Birou Arhitect Univ ; Tablouri de colecţii Valorile nonatomice din schemele relaţionale pot fi reprezentate şi prin tipul colecţie. În general, o colecţie poate fi o structură de date din categoria mulţimilor, listelor, multiset-urilor sau tablourilor. Standardul SQL permite, în forma sa actuală, numai tipul tablou. O coloană a unei tabele poate fi definită (specificată) ca un tablou, adăugând la tipul de date al coloanei cuvântul cheie array. La rândul său, acest cuvânt cheie este urmat de numărul maxim de elemente pe care le poate conţine, înscris între paranteze drepte. Accesul la prima poziţie dintr-o tabelă este realizat cu o valoare de index de unu. În exemplul care urmează se arată cum pot fi memorate direct identificatoarele membrilor biroului de arhitectură în interiorul fiecărei linii (rând) a tabelei (relaţiei) birouarhitectura, folosind atributul cu numele membri: create table birouarhitectura( Idb varchar(10), nume varchar(50), adresa row(strada varchar(30), cladirea varchar(5), camera varchar(5)), analistsistematizare varchar(11) references architect(idp), membri varchar(11) array[50] references architect(idp), primary key (Idb)); Constructorul de tip array este folosit pentru a rezerva spatiu structurii tablou şi, de asemenea, serveşte la atribuirea de valori elementelor tabloului. Pentru a iniţializa structura tabloului membrii la o valoare vidă se foloseşte instrucţiunea insert cu un constructor de tip array fără elemente: insert into birouarhitectura values( BA101, Birou Arhitect Univ, 2

row( Spl Independentei, Cladire centrala, Cam 301 ), AS110, array[]); În continuare, structurii tablou i se pot adăuga identificatoarele specifice ale membrilor biroului de arhitectură, cu ajutorul constructorului de tablou, în cadrul unei instrucţiuni update. Pentru atribuirea de valori primelor trei poziţii ale structurii tablou membrii se foloseşte aserţiunea: update birouarhitectura set membri=array[,, ] where nume= Birou Arhitect Univ ; Atribuiri de valori ale poziţiilor individuale în interiorul unei structuri tablou se pot efectua, de asemenea, cu ajutorul unei valori de index specifice: update birouarhitectura set membri[4]= where nume= Birou Arhitect Univ ; Pentru a realiza accesul la o poziţie anumită într-un tablou, se foloseşte un index. De pildă, pentru a extrage identificatorul celui de al doilea element al unui birou de arhitectură folosim instrucţiunile: select membri[2] from birouarhitectura where nume= Birou Arhitect Univ ; Pentru determinarea dimensiunii (lungimii) unui tablou se foloseşte funcţia cardinality. Această funcţie este utilă pentru realizarea iteraţiilor în interiorul unui tablou, în rutinele SQL. De exemplu, pentru a găsi lungimea curentă a tabloului membri, admiţând că în tabela birouarhitectura se foloseşte un cursor C, este introdusă comanda cardinality(c.membri). Folosirea generală a tablourilor constă în reprezentarea atributelor multi-valoare. De asemenea, tablourile sunt utile în modelarea părţii multi a asocierilor 1:N sau M:N, inclusiv în cazul limbajului de definire ODL. Tipuri definite de utilizator (UDT) Termenul UDT este standard în SQL, având acelaşi înţeles ca termenul tip abstract de date. În legătură cu acest ultim concept, ne reamintim că utilizatorul defineşte tipuri noi care au o anumită formă a structurii interne, fiind de asemenea definite metode care descriu comportarea acelor tipuri. Reprezentarea internă a unui tip este încapsulată de comportarea acestuia, ceea ce înseamnă că implementarea internă a tipului de date este ascunsă faţă de lumea exterioară. Această implementare se poate schimba, fără a influenţa modul în care un utilizator interacţionează cu tipul de date. În standardul SQL, tipurile definite de utilizator sunt însă întrucâtva diferite faţă de definiţia strictă a tipurilor abstracte de date. Diferenţa provine în special din faptul că atât toate atributele interne ale unui UDT, cât şi metodele asociate, sunt publice. Aceste elemente nu pot fi mascate ca fiind protejate sau private, aşa cum se procedează în limbaje ca Java sau C++. Folosirea atributelor publice şi a metodelor dă posibilitatea ca structura internă a unei instanţe a tipului introdus de utilizator să fie integrată printr-un limbaj ca SQL. Virtutea principală a UDT stă în faptul că ele permit proiectanţilor de baze de date să definească tipuri noi de date, orientate către aplicaţie, în afară de tipurile atomice şi construite din categoria build-in, iar apoi să folosească noile tipuri în definirea de tabele (relaţii). Desigur, cu ajutorul UDT pot fi create tabele în mediul relaţional. 3

Sintaxa SQL pentru crearea tipurilor definite de utilizator (UDT) create table <user_defined_type_body> <user_defined_type_body> ::= <user_defined_type_name> [under <user_defined_type_name>] [as <representation>] [[not] <instantiable>] [[not] final] [ref is system generated ref using <predefined_type> ref from <attribute_name> [{, attribute_name} ]] [<method_specification_list>] <representation> ::= <predefined_type> <member_list> <member_list> ::= (<attribute_definition>) [{, <attribute_definition>} ] <attribute_definition> ::= <attribute_name> {<data_type> <collection_type>} [<reference_scope_ check>] [default <default_value>] <data_type> ::= <predefined_type> <reference_type> <collection_type> ::= <data_type> array [unsigned_integer] /* [] part of syntax */ <method_specification_list> ::= <method_specification> [{, <method_specification>} ] <method_specification> ::= <partial_method_specification> <overriding_method_specification> <overrinding_method_specification> ::= overriding <partial_method_specification> <partial_method_specification> ::= [constructor] method <method_name> <SQL_parameter_declarations> returns <data_type> Tipuri distincte Folosesc pentru asocierea unei înţelegeri speciale cu un tip atomic existent. De fapt, definesc o formă nouă a unui tip atomic. Exemplu: create type varsta as integer final; create type greutate as integer final; create table persoana( Idpersoana varchar(3), Varstapersoana varsta, Greutatepersoana greutate, primary key (Idpersoana)); Cuvântul cheie final reprezintă elementul de sintaxă pentru tipurile distincte în standardul SQL actual, indicând faptul că nu poate fi definit un subtip al tipului distinct. Mai observăm că odată definite valorile varsta şi greutate de mai sus nu pot fi comparate. Aceste valori nu pot fi amestecate cu tipul integer normal, întrucât varsta, greutate si integer sunt, conceptual, tipuri diferite. Totuşi, remarcăm că folosirea în aceeaşi construcţie a tipurilor distincte şi a tipurilor atomice pe care ele se bazează este posibilă dar numai atunci când folosim (adăugăm) funcţia cast. Exemplu: select Idpersoana from persoana where cast(varstapersoana as integer)*2 < cast(greutate persoana as integer); Tipuri structurate Sunt compuse din câteva componente interne, fiecare din acestea putând fi de un tip diferit. O instanţă a unui tip structurat este o valoare compusă, deoarece tipul conţine mai multe componente. Exemplu: 4

create type adresaudt as( strada varchar(90), cladirea varchar(5), camera varchar(5)) not final; Mai sus, clauza not final indică posibilitatea definirii de sub-tupluri ale tipului structurat. Menţionăm că atributele tipului structurat pot aparţine unor tipuri build-in atomice, construite sau chiar UDT. Tipul adresaudt definit poate, la rândul său, contribui la definirea tipului coloanei adresa în tabela birouarhitectura: create table birouarhitectura( Idb varchar(10), nume varchar(50) not null, adresa adresaudt, analistsist varchar(11) references analistsistematizare(idp), membri varchar(11) array[50] references architect(idp), primary key (Idp)); Metode interne pentru tipurile structurate Într-un tabel anterior, am arătat, mai înainte, în contextul rutinelor menţionate (invocate) în cadrul SQL, că sunt trei tipuri de proceduri stocate: funcţii, proceduri şi metode. Metodele sunt asociate în special cu tipurile structurate, ele fiind de fapt funcţii strâns legate cu definirea acestor tipuri. Ca urmare, tipurile structurate permit încapsularea un tip de acest fel fiind manipulat (prelucrat) numai în metode definite de el. În standardul SQL, metodele pot fi definite ca proceduri. O excepţie Oracle, care admite definirea metodelor ca funcţii şi proceduri. Tipuri de metode interne (build-in) pentru tipurile structurale de date: funcţia constructor, funcţia observer (observator), funcţia mutator. Aceste metode sunt conţinute automat în definirea tipurilor. Funcţia constructor are acelaşi nume ca şi tipul, şi este folosită în crearea de instanţe ale tipului, fiind invocată prin expresia new. Funcţia observer este folosită pentru extragerea valorilor unui tip structurat; pentru fiecare atribut al tipului structurat există o funcţie observer, cu acelaşi nume ca atributul. Funcţia mutator este folosit pentru modificarea valorilor atributelor unui tip structurat. Funcţiile observer si mutator sunt menţionate (invocate, de fapt) prin notaţia punct ( dot ): (Variabilă.NumeFuncţie). Această notaţie stă în locul notaţiei convenţionale (NumeFuncţie (parametrii)), folosită numai pentru funcţiile care nu sunt metode. Exemplu rutină SQL prin care se crează o instanţă de tipul adresaudt, folosind funcţiile constructor şi mutator: begin end. declare adr adresaudt /* invocare functie constructor */ set adr = new adresaudt(); /* invocare functie mutator */ set adr.strada = Spl Independentei ; set adr.cladirea = Cladire Centrala ; set adr.camera = cam 301 ; insert into birouarhitectura values( BA101, Birou Arhitect Univ, adr, /* initializare adresa */ AS110, Array[]); 5

Pentru a extrage valori de atribute ale tipului structurat se foloseşte funcţia observer, ca în exemplul: select nume, c.adresa.strada, c.adresa.cladirea, c.adresa.camera from birouarhitectura c where nume = Birou Arhitect Univ ; Metode definite de utilizator pentru tipurile structurale Utilizatorul defineşte semnătura fiecărei metode, prin introducerea numelui metodei, a numelor parametrilor si a tipurilor acestora. Exemplu: definirea metodei cu numele suma pentru tipul structurat cu numele treinumere. Semnătura arată că această metodă nu are parametrii expliciţi definiţi. Metoda are ca rezultat o valoare de tip integer. De obicei însă, fiecare metodă are un parametru implicit, care este instanţa tipului de date pentru care se defineşte metoda. Valoarea parametrului implicit este obţinută în implementarea metodei prin cuvântul cheie self. Iată definiţia metodei: create type treinumere as (unu integer, doi integer, trei integer) not final; method suma() returns integer; create method suma() returns integer for treinumere begin return self.unu + self.doi + self.trei; end. Utilizatorul / programatorul poate ignora funcţia constructor a unui tip structurat. Deoarece funcţia constructor definită de sistem nu admite parametrii, prin ignorarea funcţiei constructor se realizează o formă diferită a funcţiei, care poate fi folosită pentru a preciza valorile atributelor specifice în momentul în care este creată o instanţă a tipului de date. În continuare, este prezentat un exemplu privind ignorarea funcţiei constructor a tipului adresaudt. Potrivit sintaxei SQL pentru crearea UDT, cuvântul cheie overriding trebuie specificat neapărat, pentru a indica faptul că metoda suprascrie o funcţie existentă: create type adresaudt as( strada varchar(30), cladirea varchar(5), camera varchar(5)) not final; overriding constructor method /**/ adresaudt(strada varchar(30), cladirea varchar(5), camera varchar(5)) returns adresaudt; create method adresaudt(str varchar(30), clad varchar(5), cam varchar(5)) returns adresaudt for adresaudt begin set self.strada = str; set self.cladirea = clad; set self.camera = cam; end. Cuvântul cheie constructor trebuie specificat mai sus deoarece metoda care se ignoră este, în acelaşi timp, o funcţie constructor. Desigur, numele metodei este acelaşi ca numele funcţiei constructor definită de sistem (adresaudt). Definiţia metodei conţine specificarea parametrilor şi tipurilor acestora. Implementarea metodei arată modul în care se folosesc parametri pentru a atribui valori unei instanţe prin funcţii mutator. De observat că metoda extrage self ca o valoare, care este instanţa modificată de tipul adresaudt. 6

Funcţia constructor definită de utilizator poate fi acu folosită pentru a crea o instanţă nouă de tipul adresaudt şi, în acelaşi timp, de a introduce valori ale atributelor acesteia: declare adr adresaudt; set adr = new adresaudt( Spl Independentei, Cladire Centrala, Cam 301 ); Tabele tipizate În standardul SQL, o instanţă a unui UDT este o valoare. Pentru a crea conceptul de obiect, ca în tehnologia bazelor de date orientate obiect, trebuie folosit un UDT împreună cu o tabelă tipizată. Tabela tipizată este o formă nouă de tabelă în standardul SQL, asociată întotdeauna cu un anumit tip structurat. Pentru fiecare atribut al tipului structurat pe care se sprijină, o tabelă tipizată are o coloană. În plus, va avea o coloană cu auto-referire, care conţine un identificator unic de obiect pentru fiecare linie (rând) al tabelei. Acest identificator se numeşte referire. Când pentru definirea unei tabele tipizate se foloseşte un tip structurat, o instanţă a acestui tip este văzută ca un obiect, al cărui identificator este dat de coloana cu auto referire. Spre deosebire de identificatoarele de obiecte folosite în bazele de date orientate obiect, un identificator de obiect este unuic numai în contextul unei tabele tipizate specifice. Deci două tabele tipizate pot avea linii cu valori cu auto-referire identice. Pentru a exemplifica folosirea tabelelor tipizate, să admitem că dorim implementarea clasei Edificii din diagrama de clase Persoana-Arhitect-Edificii, ca o tabelă tipizată. Mai întâi, definim tipul structurat edificiiudt: create type edificiiudt as( cod varchar(3), nume varchar(40)) instantiable not final ref is system generated; În codul de mai sus, edificiiudt defineşte atributele cod şi nume. Observăm însă prezenţa a două clauze, instantiable şi ref, care au fost introduse anterior, prin sintaxa SQL pentru crearea UDT. Clauza instantiable arată că pentru tipul creat există o funcţie constructor şi astfel utilizatorul (prgramatorul) poate crea direct instanţe ale acestui tip. Dacă însă tipul creat este specificat ca fiind ne-instanţiabil, prin clauza not-instantiable, nu va exista o funcţie constructor pentru acest tip. Folosirea ultimei clauze, de ne-instanţiere, are sens numai pentru un tip care posedă un sub-tip, caz în care instanţele tipului sunt create numai la nivel de sub-tip. Ierarhiile de tipuri se vor examina mai târziu. Un tip structurat folosit împreună cu o tabelă tipizată trebuie întotdeauna specificat ca instanţiabil. Clauza ref permite programatorului să specifice modul (mijloacele) de generare a valorii pentru referirea unui obiect. Sunt trei forme a clauzei ref: a) ref operaţiunea de referire este generată de sistem; în acest caz, sistemul de bază de date este răspunzător de generarea unei referiri unice de obiect pentru instanţele tipului. b) ref using arată că referirea este generată de programator. Aceasta trebuie să introducă o referire unică pentru fiecare instanţă a tipului, valoarea referirii fiind de tipul indicat în clauză. c) ref from arată că programatorul este cel care trebuie să dea lista atributelor tipului structurat, care va fi folosită pentru a obţine o referire unică de obiect. 7

În contextul de aici, se utilizează numai referirile generate de sistem, ca cea mai adecvată pentru înţelegerea folosirii obiectelor. Sintaxa SQL pentru crearea tabelelor tipizate După ce a fost definit UDT, ca mai sus, se crează o tabelă tipizată corespunzătoare structurii acesteia. Iată sintaxa pentru crearea tabelelor tipizate: create table <table_name> of <user_defined_type_name> [under <supertable_name>] [<table_element_list>] <table_element_list> ::= (<table_element> [{, <table_element>} ]) <table_element> ::= <table_constraint> <self_referencing_column_specification> <column_options> <self_referencing_column_specification> ::= ref is <self_referencing_column_name> <reference_generation> <reference_generation> ::= system generated user generated derived <column_options> ::= <column_name> with options <column_option_list> <column_option_list> ::= [scope <table_name> [<reference_scope_check>]] [default <default_value>] [<column_constraint> ] Să definim, pe această bază, tabela tipizată edificii: create table edificii of edificiiudt( primary key (cod), ref is edificiiid system generated); Clauza of, mai sus, arată pe ce tip structurat se bazează tabela tipizată. Ca urmare, tabela va avea, în mod automat, coloane care corespund atributelor tipului structurat. Remarcăm că definiţia tabelelor tipizate acceptă aceleaşi restricţii pentru tabelă şi coloane, ca cele din cazul tabelelor relaţionale convenţionale. De pildă, în definiţia tabelei edificii, atributul cod al tuplului edificiiudt este luat ca cheie primară. De asemenea, se pot specifica restricţii ca unique sau not null, în formatul restricţiilor de tabelă sau de coloană. În definiţia unei tabele tipizate sunt indicate numai atributele cu restricţii. Potrivit sintaxei de mai sus, definiţia unei tabele tipizate trebuie să repete specificaţia generării referirilor într-o manieră consistentă cu specificaţia generării referirilor tipului structurat: system generated, user generated, derived. De asemenea, prin clauza ref is trebuie atribuit un nume coloanei cu auto-referire. Acest nume (în cazul nostru edificiiid) poate fi folosit pentru manipularea coloanei cu auto-referire în cazul referirilor definite de utilizator. Pentru a avea acces la valoarea de auto-referire se foloseşte coloana cu auto-referire. Pentru a introduce linii (rânduri) în o tabelă tipizată se foloseşte comanda insert, în mod concurenţial. De exemplu: insert into edificii values( SIC, Stiinta si Ingineria Calculatoarelor ); insert into edificii values( IM, Inginerie Mecanica ); Liniiile (rândurile) care se repetă în tabela tipizată edificii vor fi: (coloana cu auto-referire ) edificiiid cod nume 10287534556 SIC Stiinta si Ingineria Calculatoarelor 90324854948 IM Inginerie Mecanica 8

Valorile pentru coloana cu auto-referire sunt generate de sistem. Dacă referirea este definită de utilizator, comanda insert trebuie să conţină valoarea pentru coloana cu auto-referire. Dacă referirea este derivată din atributele tipului, restricţia primary key sau restricţiile unique şi not null pot fi prezente în definiţia tabelei, pentru a asigura o valoare unică de referire pentru atribute. Tipurile referire Anterior, a fost examinată folosirea coloanei cu auto-referire, care este, de fapt, un identificator intern de obiect, sau referire, către o linie (rând). Această referire este un tip de date numit tip referire ( reference type ), sau ref. Sintaxa este: <reference_type> ::= ref (<referenced_type>) [<scope_clause>] [array [usingend_integer]] [reference_scope_check] /* [] part of syntax */ <scope_clause> ::= scope <table_name> <refenced_type> ::= <user_defined_type_name> <reference_scope_check> ::= references are [not] checked [on delete <action>] Sintaxa pentru definirea tipurilor referire Ca exemplu, să considerăm din nou diagrama de clase Persoana-Arhitect-Edificii. Între BirouArhitectura şi AnalistSistematizare avem o asociere (legătură) 1:N. De asemenea, între BirouArhitectură şi Arhitect avem o asociere M:N. Putem acum redefinii tipul BirouArhitectUdt, pentru a folosi tipuri referire ca un mijloc de descriere a asocierilor cu obiectele AnalistSistematizare şi arhitect: create type birouarhitectudt as( Idb varchar(10), nume varchar(50) not null, adresa adresaudt, tel varchar(12), analistsistemtizare ref(analistsistematizareudt), membri ref(arhitectudt) array[50]) instantiable not final ref is system generated; create table birouarhitecturaudt( primary key (Idb), ref is birouarhitecturaid system generated); Exemplul de mai sus numai pentru a ilustra crearea tipurilor referire. Verificarea referirilor şi interogarea acestor tipuri mai târziu. 9