Sunteți pe pagina 1din 5

Proprieti relaionale avansate n standardul SQL prof. dr. ing.

Mircea Petrescu
Standardul SQL definete o baz comun pentru definirea, accesul i folosirea datelor n modelul relaional. De fapt, standardul SQL este un limbaj cuprinztor, care include sublimbaje pentru: definirea datelor, interogarea i manipularea datelor, restriciile de integritate, definirea vederilor, definirea funciilor i procedurilor, proceduri stocate, controlul tranzaciilor, trigger-e, structura programelor SQL, autorizarea utilizatorilor. Trebuie reinut faptul c n procesul definirii datelor, formularea restriciilor asupra acestora are o nsemntate nalt. Privind semnificaia unor caracteristici mai avansate ale SQL, vom remarca urmtoarele: 1. Vederile i aseriunile se folosesc n transportul schemelor conceptuale din modelul EEA i din UML n modelul relaional; 2. Procedurile SQL i modulele memorate persistente (PSM) sunt importante n dezvoltarea aspectelor de comportament ale aplicaiilor de baze de date i, din acest punct de vedere, pe ele se sprijin caracteristicile obiectual-relaionale ale SQL; 3. Folosirea trigger-elor pentru dinamizarea prelucrrii este, de asemenea, un suport al proprietilor obiectual-relaionale ale SQL; 4. Variantele SQL ncorporat i SQL dinamic se pot altura temei privind funcionarea bazelor de date pe web Unele elemente privind definirea i manipularea datelor Rememorm, mai nti, caracteristicile limbajului de definire a datelor n cele ce urmeaz fiind descris sintaxa de nivel nalt pentru definirea datelor n SQL. Se observ c definirea de baz a datelor reclam specificarea tabelelor, coloanelor i restriciilor. Meniune special: fiecare coloan ntr-o tabel are un tip de date, aa cum se arat n tabloul ce urmeaz sintaxei, precum i o posibil specificare a unei valori lips. Restricii de integritate n standardul SQL Sunt folosite n definirea schemelor de relaie, pentru explicarea nelesului semantic al datelor din baza de date. Pentru a asigura corectitudinea informaiei n orice stare dat a bazei de date, toate restriciile de integritate trebuie respectate. Sintaxa restriciilor pentru definirea datelor n SQL sunt: a) sintaxa construirii tabelelor create table <table_name> (<table_element_list>) <table_element_list> ::= <table_element> [{, <table_element>} ] <table_element> ::= <column_definition> | <table_constraint> <column_definition> ::= <column_name> <data_type> [default <default_value>] [<column_contraint> ] b) sintaxa restriciilor privind coloanele <column_contraint> ::= [constraint <constraint_name>] not null | primary key | unique | <check_constraint> | <column_reference> <check_constraint> ::= check (<boolean_valued_expression>) <column_reference> ::= references <referenced_table_name> [(referenced_column_name)] [<update>] [<delete>] c) sintaxa restriciilor privind tabelele <table_constraint> ::= [constraint <constraint_name>] <primary_key_constraint> | <unique_constraint> | <referential_constraint> | <check_constraint> <primary_key_constraint> ::= primary key (<column_name> [{, <column_name>} ]) <unique_constraint> ::= unique (<column_name> [{, <column_name>} ]) 1

<referential_constraint> ::= foreign key (<referencing_column_name> [{, <referencing_column_name>} ]) <references_specification> <referencing_specification> ::= references <referenced_table_name> [(<referenced_column_name> [{, <referenced_column_name>} ])] [<update>] [<delete>] <update> ::= on update <action> <delete> ::= on delete <action> <action> ::= no action | cascade | set null | set default Mai sus s-au folosit urmtoarele convenii de notaie: < > reprezint numele elementelor sintactice [ ] semnific o sintax opional { } semnific o sintax obligatorie | indic o alegere a sintaxei ... indic o sintax ce se repet ::= separ un element sintactic de definiia sa n SQL, restriciile pot fi formulate fie ca o parte a definiiei, fie ca restricii separate asupra definiiilor de tabele. Restriciile din cadrul unei definiii de tabel pot fi exprimate ca restricii de coloan sau ca restricii de tabel (vezi sintaxa de mai sus). Tipuri de date n SQL Categoria ir de caractere numr temporal boolean construite Tipuri de date char, varchar, nchar, nchar varying, clob (character large object), nclob int, integer, smallint, numeric decimal, float, real, double precision date, time, timestamp, interval boolean (true, false or unknown) user defined type (UDT) reference type row type collection type blob (binary large object) bit, bit varying

ir binar ir de bii

Unele meniuni suplimentare fat de coninutul sintaxei pentru definirea datelor: restricia foreign key definete noiunea de integritate referenial ntre o cheie strin din o tabel (relaie) i o cheie primar din alt tabel (sau din aceeai). Integritatea refereniat prin restricia de cheie strin este fundamental n definirea schemei unei baze de date relaionale. Aceast restricie oblig valoarea cheii strine (care este compus din una sau mai multe coloane atribute) s fie sau null sau egal cu valoarea unei chei primare la care se refer. Cheia strin trebuie s aib acelai tip de date ca i cheia primar cu care este legat. Pentru actualizarea definiiilor tabelelor se folosesc urmtoarele tipuri de sintax: Sintaxa modificrii alterrii tabelelor: alter table <table_name> etc. Sintaxa eliminrii tabelelor: drop <table_name> <drop_behavior> etc. Sintaxa limbajului de manipulare a datelor: Sintaxa introducerii de valori: insert into <table_name> [<column_name> ] Sintaxa eliminrii de cod: delete from <table_name> [where <search_condition>] Sintaxa pentru axtualizare: update <table_name> set <set_clause> Sintaxa vederilor: 2

n SQL vederile sunt tabele derivate. Tabelele de acest tip nu sunt memorate fizic n baza de date, ci sunt calculate dinamic prin aciunea frazelor de interogare. Sintaxa: create [recursive] view <view_name> [(<column_name> [{, <column_name>} ])] as <SQL_query>; Aseriuni Pentru formularea unor restricii mai generale dect cele corespunznd tabelelor i coloanelor, SQL d posibilitatea folosirii unei instruciiuni specifice, cu sintaxa: create assertion <constraint_name> check (search_condition); Spre deosebire de restriciile de tabele i de coloane, aseriunile nu sunt asociate cu nicio definiie de tabel particular. Aseriunile sunt folosite de obicei pentru a formula restricii asupra mai multor tabele. Remarcm c pentru a satisface restricia, condiia din clauza check trebuie s furnizeze o valoare fie true, fie unknown. Sintaxa rutinelor menionate n codul SQL (proceduri stocate) Cu ajutorul rutinelor menionate n cadrul SQL sau proceduri stocate se creaz proceduri sau funcii, care apoi pot fi menionate (sau invocate) din cadrul SQL. Sunt similare cu procedurile i funciile din alte limbaje de programare. Un tip de rutin SQL invocat este metoda din contextul tipurilor definite de utilizator (UDT). Distingem dou tipuri de rutine invocate din SQL: rutine SQL scrise n limbajul SQL; rutine externe scrise ntr-un limbaj extern, ca C++, Java, Fortran. Decizia privind tipul de rutin este luat de programatorul de aplicaie. Rutinele externe pot conduce la neadaptare de impedan, dac tipurile de date din SQL nu se potrivesc cu tipurile de date convenabile limbajului extern. Sintaxa unei proceduri SQL: create procedure <routine_name> ([<parameter> ]) <routine_body> <parameter> ::= [{in | out | inout}] [<parameter_name>] <data_type> <routine_body> := <SQL_statement> Sintaxa unei funcii SQL: create function <routine_name> ([<parameter> ]) returns <datatype> <routine_body> <parameter> ::= [<parameter_name>] <data_type> <routine_body> ::= return <value_expression> | null Sintaxa pentru apelarea (din cod SQL) a procedurilor i funciilor este: call <routine_name> ([<SQL_argument_name> ]) Crearea i apelarea rutinelor externe n documentaia de detaliu a standardului SQL. Module memorate persistente (PSM) PSM este o opiune a standardului SQL. Prin PSM sunt mbogite rutinele SQL cu concepte tipice pentru limbajele de programare de nivel nalt. PSM sunt implementate complet de puine sisteme comerciale de baze de date. Exemplu de limbaj care amintete de PSM este PL/SQL din Oracle. Standardul SQL actual permite creterea completitudinii de prelucrare prin folosirea urmtoarelor faciliti: Instruciuni compuse: 3

n PSM, corpurile rutinelor pot fi complicate pn la aseriuni compuse, prin folosirea comenzii: begin ... end. Prin folosirea aseriunilor compuse, se pot introduce specializarea total i restricia ISA. Variabile: Prin PSM, rutinele SQL pot fi completate cu declaraii de variabile i cu instruciuni (comenzi) de atribuire. De exemplu: declare deptCode varchar(3); declare deptName varchar(50); ... set deptCode = CSE; Mulimi de rezultate i cursoare n SQL, rezultatul unei interogri poart numele de mulime rezultat. Cursorul este o proprietate a PSM pe care se sprijin procesul de iteraii pe liniile unei mulimi rezultat. Cursoarele pot fi folosite pentru a controla evoluia execuiei comenzilor SQL. n fond, un cursor este un pointer folosit pentru a examina fiecare rnd al unei mulimi rezultat. Sintaxa asociat cu folosirea cursoarelor: declare <cursor_name> cursor for <SQL_query> open <cursor_name> [cascade <on|off>] fetch [[first | last | prior | next] from] <cursor_name> into <variable _name> [{, <variable_name>} ] close <cursor_name> Instruciuni (comenzi) pentru controlul fluxului prelucrrii Cursoarele sunt foarte utile n efectuarea diferitelor tipuri de comenzi de buclare (looping) folosite de PSM. Dintre acestea, se menioneaz: for, while, loop, repeat. Folosirea acestora este similat cu modul de utilizare n limbajele de nivel nalt. Dinamizarea prelucrrii cu ajutorul trigger-elor Trigger-ele sunt destinate dinamizrii prelucrrii sistemelor relaionale de baze de date. Se bazeaz pe noiunea de eveniment condiie aciune, respectiv pe reguli ce in de cele trei componente ale principiului de mai sus. Acestea sunt reguli active, definite iniial n domeniul bazelor de date active. Un sistem activ de baz de date ofer proiectantului unei aplicaii posibilitatea de a monitoriza apariia unor tipuri specifice de evenimente care se porduc n baza de date. Aceste evenimente sunt de obicei modificri ale datelor, dar pot fi i menionri (invocri) de proceduri i funcii, sau chiar producerea de evenimente generate de tactul sistemului. Cnd se produce un eveniment, o regul activ determin evaluarea unei condiii. Dac rezultatul este adevrat, se execut aciunea regulei. Regulile active sunt pentru corectarea nclcrii restriciilor, gestiunea fiierelor-jurnal, etc. Sintaxa trigger-elor specific: 1) apariia n timp a trigger-ului, prin before ... sau after ... 2) tipul de trigger row sau statement; 3) clauza referencing, pentru folosirea tabelelor de tranzacie. 4

Sintaxa debuteaz ca mai jos, pentru trigger-ul cu numele statement: create trigger <trigger_name> {before | after} {insert | delete | update [of <column_name> [{, <column_name>} ]]} on <table_name> [referencing <old_or_new_values_alias_list>] [for each {row | statement}] [when (search_condition)] <trigger_SQL_statement> <old_or_new_values_alias_list> ::= [old [row] [as] old values <correlation_name>] [new [row] [as] new values <correlation_name>] [old table [as] <old_values_table_name>] [new table [as] <new_values_table_name>] <trigger_SQL_statement> ::= <SQL_statement> | begin atomic <SQL_statement> end SQL incorporat Limbaje care accept folosirea SQL incorporat sunt Ada, C, Cobol, Fortran, MUMPS, Pascal, PL/I i SQLJ (pentru Java). ntr-un limbaj care accept SQL incorporat, fiecare instruciune SQL trebuie precedat de: exec sql ... ca mai jos: Exemplu cu limbaj gazd C: exec sql begin declare section; char code[3]; char name[40]; exec sql end declare section; strcpy(code, ASC); strcpy(name, Automatica si Stiinta Calculatoarelor); exec sql insert into department values (:code, :name); SQL dinamic SQL incorporat este static; aici toate instruciunile SQL ce urmeaz s fie executate dintr-un program scris n limbaj gazd, sunt cunoscute dinainte. Avantaj al SQL static (incorporat): instruciunile SQL sunt compilate i optimizate n timpul unui proces de pre-prelucrare, ceea ce mbuntete execuia aplicaiei. n mod diferit, SQL dinamic este o parte a standardului SQL actual care folosete SQL n mod direct n codul aplicaiei. Cu alte cuvinte, utilizatorii introduc direct interogri SQL, n mod dinamic, sau construiesc interogri n interiorul codului aplicaiei. Pentru a compila, optimiza i executa o fraz de interogare n acest regim, se folosete comanda: execute immediate. Interfaa de nivel de apelare Aceast interfa (CLI Call-Level Interface) este o manier mai dinamic de a comunica cu o baz de date, dect SQL incorporat sau SQL dinamic. Avantajul CLI este c nu necesit un preprocesor SQL dinamic. Pentru interaciunea cu bazele de date relaionale este folosit interfaa de programare pentru aplicaie (API application programming interface) amplasat ntre limbajul de programare folosit i baza de date. Prin urmare, un limbaj care utilizeaz CLI poate comunica dinamic cu cteva sisteme de baze de date. Deci, programul nu este compilat n mod specific pentru comunicare cu un singur sistem de baz de date, ca n cazul SQL incorporat. Un alt avantaj al CLI este c permite interogarea metadatelor unei baze de date. Originea CLI n ODBC Open Database Connectivity.