Sunteți pe pagina 1din 60

UNIVERSITATEA TEHNIC DIN CLUJ-NAPOCA coala academic postuniversitar Informatic aplicat i programare

ORACLE Evidena internrilor din unitile spitaliceti Lucrare de disertaie

Ioana Marinela Iclozan (Nndrean):

2010

CAPITOLUL 1. TEORIA BAZELOR DE DATE RELAIONALE


1 MODELUL RELAIONAL

Modelul relaional a fost propus de catre IBM i a revoluionat reprezentarea datelor fcnd trecerea la generatia a doua de baze de date. Modelul este simplu, are o solid fundamentare teoretic fiind bazat pe teoria seturilor (ansamblurilor) i pe logica matematic. Pot fi reprezentate toate tipurile de structuri de date de mare complexitate, din diferite domenii de activitate. Modelul relaional este definit prin: structura de date, operatorii care acioneaza asupra structurii si restriciile de integritate. 1) Conceptele utilizate pentru definirea structurii de date sunt: domeniul, tabela (relaia), atributul, tuplul, cheia i schema tabelei. Domeniul este un ansamblu de valori caracterizat printr-un nume. El poate fi explicit sau implicit. Tabela/relaia este un subansamblu al produsului cartezian al mai multor domenii, caracterizat printr-un nume, prin care se definesc atributele ce aparin aceleai clase de entiti. Atributul este coloana unei tabele, caracterizat printr-un nume. Cheia este un atribut sau un ansamblu de atribute care au rolul de a identifica un tuplu dintr-o tabela. Tipuri de chei: primare/alternate, simple/comune, externe. Tuplul este linia dintr-o tabela i nu are nume. Ordinea liniilor (tupluri) i coloanelor (atribute) dintr-o tabel nu trebuie s prezinte nici-o importan. Schema tabelei este format din numele tabelei, urmat ntre paranteze rotunde de lista atributelor, iar pentru fiecare atribut se precizeaz domeniul asociat. Schema bazei de date poate fi reprezentat printr-o diagram de structur n care sunt puse n eviden i legturile dintre tabele. Definirea legturilor dintre tabele se face logic construind asocieri ntre tabele cu ajutorul unor atribute de legatur. Atributele implicate n realizarea legturilor se gsesc fie n tabelele asociate, fie n tabele distincte construite special pentru legturi. Atributul din tabela iniial se numete cheie extern, iar cel din tabela final este cheie primar. Legturile posibile sunt 1:1, 1:m, m:n. Potenial, orice tabel se poate lega cu orice tabel, dup orice atribute. Legaturile se stabilesc la momentul descrierii datelor prin limbaje de descriere a datelor (LDD), cu ajutorul restriciilor de integritate. Practic, se stabilesc i legturi dinamice la momentul execuiei. 2) Operatorii modelului relaional sunt operatorii din algebra relaional i operatorii din calculul relaional. Algebra relaional este o colecie de operaii formale aplicate asupra tabelelor (relaiilor), i a fost conceputa de E.F.Codd. Operaiile sunt aplicate n expresiile algebrice relaionale care sunt cereri de regsire. Acestea sunt compuse din operatorii relaionali i operanzi. Operanzii sunt ntotdeauna tabele (una sau mai multe). Rezultatul evalurii unei expresii relaionale este format dintr-o singur tabel. Algebra relaional este prin definiie neprocedural (descriptiv), iar calculul relaional permite o manier de cautare mixt (procedural/neprocedural). Calculul relaional se bazeaz pe calculul predicatelor de ordinul nti (domeniu al logicii) i a fost propus de E.F. Codd. Predicatul este o relaie care se stabilete ntre anumite elemente i care poate fi confirmat sau nu. Predicatul de ordinul 1 este o relaie care are drept argument variabile care nu sunt predicate. Variabila poate fi de tip tuplu (valorile sunt dintr-un tuplu al unei tabele) sau domeniu (valorile sunt dintr-un domeniu al unei tabele). Cuantificatorii (operatorii) utilizai n
2

calculul relaional sunt: universal ( ) i existenial ( ). Construcia de baz n calculul relaional este expresia relaional de calcul tuplu sau domeniu (funcie de tipul variabilei utilizate). Expresia relaional de calcul este format din: operaia de efectuat, variabile (tuplu respectiv domeniu), condiii (de comparaie, de existen), formule bine definite (operanzi-constante, variabile, funcii, predicate; operatori), cuantificatori. Pentru implementarea acestor operatori exist comenzi specific n limbajele de manipulare a datelor (LMD) din sistemele de gestiune a bazelor de date relaionale (SGBDR). Aceste comenzi sunt utilizate n operaii de regsire (interogare). Dup tehnica folosit la manipulare, LMD sunt bazate pe: - calculul relational (QUEL n Ingres, ALPHA propus de Codd); - algebra relaional (ISBL, RDMS); - transformare (SQL, SQUARE); - grafica (QBE, QBF). 3) Restriciile de integritate ale modelului relaional sunt structurale si comportamentale. Restriciile structurale sunt: Restricia de unicitate a cheii Restricia referenial Restricia entitii. Cele trei restricii de mai sus sunt minimale. Restriciile de comportament sunt cele care se definesc prin comportamentul datelor i in cont de valorile din BDR: Restricia de domeniu. Restricii temporare Restriciile de integritate suportate de Oracle sunt: NOT NULL nu permite valori NULL n coloanele unei tabele; UNIQUE nu sunt permise valori duplicat n coloanele unei tabele; PRIMARY KEY nu permite valori duplicate sau NULL n coloana sau coloanele definite astfel; FOREIGN KEY presupune ca fiecare valoare din coloan sau setul de coloane definite astfel s aib o valoare corespondent identic n tabela de legatur, tabel n care coloana corespondent este definit cu restricia UNIQUE sau PRIMARY KEY; CHECK elimin valorile care nu satisfac anumite cerine (condiii) logice. Termenul de chei (keys) este folosit pentru definirea ctorva categorii de constrngeri i sunt: primary key, unique key, foreign key, referenced key. Se consider c modelul relaional are o serie de limite cum ar fi: simplitatea modelului l face dificil de aplicat pentru noile tipuri de aplicaii (multimedia, internet etc.); nu asigur o independen logic total a datelor de aplicaie; poate crete redundana datelor.

1.1.

BAZE DE DATE RELAIONALE

Bazele de date relaionale (BDR) utilizeaz modelul de date relaional i noiunile aferente. BDR au o solid fundamentare teoretic, n special prin cercetrile de la IBM conduse de E.F.Codd. BDR este un ansamblu organizat de tabele (relaii) mpreun cu legturile dintre ele. Atunci cnd dorim s realizm o baz de date relaional trebuie s tim clar ce avem de fcut, adic s stabilim obiectivele activitii noastre. n acest sens, cteva dintre cele mai importante obiective sunt: Partiionarea - aceleai date trebuie s poat fi folosite n moduri diferite de ctre diferii utilizatori; Deschiderea - datele trebuie s fie uor adaptabile la schimbrile care pot aprea
3

(actualizarea structurii, tipuri noi de date etc.); Eficiena - stocarea i prelucrarea datelor, care trebuie s se fac la costuri ct mai sczute, costuri care s fie inferioare beneficiilor obinute; Reutilizarea - fondul de date existent trebuie s poata fi reutilizat n diferite aplicatii informatice; Regsirea Accesul - modul de localizare a datelor Modularizarea - realizarea BDR trebuie s se poat face modular pentru generalitate i posibilitatea lucrului n echip; Protecia Redundana implementarea unui model de date pentru baze de date i utilizarea unei tehnici de proiectare a BDR. Independena 1.1.1. EXEMPLE DE SISTEME DE GESTIUNE A BAZELOR DE DATE RELAIONALE DB2 Este realizat de firma IBM. Sistemul respect teoria relaional, este robust i se bazeaz pe SQL standard. Permite lucrul distribuit i are modul de optimizare a regsirii. Informix. Este realizat de firma Informix, respect teoria relaional distribuit. i permite lucrul

Progress. Este realizat de firma Progress Software. Are limbaj propriu (Progress 4GL), dar suport i SQL. Ruleaz pe o gam larg de calculatoare sub diferite sisteme de operare. SQL Server. Este realizat de firma Microsoft. Se bazeaz pe SQL i ruleaz n arhitectura client/server. Ingress II . Este realizat de firma Computer Associates. Este un SGBDR complet, implementeaz dou limbaje relaionale (nti QUEL i apoi SQL) i este suportat de diferite sisteme de operare (Windows, UNIX). Visual FoxPro Este realizat de firma Microsoft. Are un limbaj procedural propriu foarte puternic, o extensie orientat obiect, programare vizual i nucleu extins de SQL. Access Este realizat de firma Microsoft. Se bazeaz pe SQL, are limbajul procedural gazd (Basic Access) i instrumente de dezvoltare. Paradox. Este realizat de firma Borland. Are limbaj procedural propriu (PAL) i suport SQL. Oracle Este realizat de firma Oracle Corporation USA. Sistemul este complet relaional, robust, se bazeaz pe SQL standard extins. Oracle Database Express Edition este un server de baze de date relaionale. ntr-o baz de date relaional datele sunt pstrate n fiiere de date. Un fiier conine articole avnd fiecare aceeai structur, definit la crearea sa. Structura articolelor unui fiier de date este definit la crearea sa, prin precizarea cmpurilor pe care le va conine. Un cmp se caracterizeaz prin nume, tipul informaiei coninute, lungime i numrul de zecimale (pentru cmpuri numerice). Un server Oracle XE opereaz cu o singur baz de date. Administratorul bazei de date creaz conturi ale

utilizatorilor crora le atribuie drepturile necesare operrii n interiorul bazei Oracle XE. Un astfel de utilizator devine astfel proprietarul unui subdomeniu inclus n baza Oracle XE denumit de ctre autorii aplicaiei "schem" (engl. schema). Dup nregistrarea contului, beneficiarul acestuia poate realiza infrastructura pe care se va baza aplicaia sa : tabele, interogri, vederi, proceduri, etc.. Domeniile diferitilor utilizatori sunt n principiu complet separate, un utilizator avnd ns posibilitatea de a da si altor utilizatori drepturi de acces la componentele domeniului su. Dimensiunea bazei de date administrate de Oracle XE este limitat la 4 GO (4 gigaoctei).

CAPITOLUL 2.
FACILITILE I ARHITECTURA SISTEMULUI ORACLE 1. EVOLUIA I FACILITILE SISTEMULUI ORACLE

Sistemul Oracle este realizat de firma Oracle Corporation care a fost nfiinat n anul 1977 n SUA - California i acum este cel mai mare furnizor de software de gestiunea datelor. Acesta este operaional pe toat gama de calculatoare (micro, mini, mainframe) sub diverse sisteme de operare. Prima versiune de SGBD Oracle a fost realizat la sfritul anilor '70 respectnd teoria relaional. n cadrul sistemului a fost implementat de la nceput limbajul relaional SQL pe care l-a dezvoltat ulterior fa de versiunea standard rezultnd SQL*Plus. ncepnd cu versiunea 5.0 SGBD Oracle are urmtoarele faciliti suplimentare: funcioneaz n arhitectura client/server; are limbaj procedural propriu PL/SQL; are precompilatoare ca interfa cu limbajele universale. n iunie 1997 s-a lansat SGBD Oracle versiunea 8.0 inclusiv n Romnia. n noiembrie 1998 s-a lansat SGBD Oracle 8i ca sistem de baze de date pe Internet. Ulterior a fost lansat sistemul Oracle 9i care a marcat trecerea la o noua generaie de servicii internet. El este mai mult dect un suport pentru baze de date deoarece ofer o infrastructur complet de software pentru afaceri electronice (e-business) i ruleaz pe o varietate de sisteme de calcul i de operare: SUN-SOLARIS, HP-UX, IBM-AIX, PC_WINDOWS, XX- LINUX. Componenta Oracle WebDB a evoluat n Oracle Portal. Oracle 9i DATABASE are fa de versiunea anterioar asigurat o protecie ridicat i automatizat, iar costul administrrii bazei de date scade n mod drastic. Oracle 9i REAL APPLICATION CLUSTERS (RAC) se bazeaz pe o nou arhitectur de BD numit mbinare ascuns (Cache Fusion). Aceasta este o noua generaie de tehnologie de clustere. Conform acestei arhitecturi la adaugarea unui calculator ntr-o retea cu BD Oracle, clusterele se adapteaz automat la noile resurse, far s fie necesar redistribuirea datelor sau rescrierea aplicaiei. Posibilitatea apariiei unei erori la o configuraie cu 12 calculatoare sub Oracle 9i RAC este foarte mic, estimat ca durat n timp la cca 100.000 de ani. n Oracle 9i APPLICATION SERVER se pot creea i utiliza aplicaii Web care sunt foarte rapide i permit integrarea serviciilor de Internet. Oracle 9i DEVELOPER SUITE este un mediu complet pentru dezvoltarea aplicaiilor tip afaceri electronice (e-business) i tip Web. El se bazeaz pe tehnologiile Java i XML i permite
5

personalizarea (Oracle Personalization). n anul 2003 a fost lansat versiunea Oracle 10g care adaug noi faciliti sistemului Oracle 9i.

1.1.

ARHITECTURA SISTEMULUI ORACLE

Componentele care formeaz arhitectura de baz Oracle sunt dispuse ntr-o configuraie client/server. Aceste componente sunt plasate pe calculatoare diferite ntr-o reea asigurnd functionaliti specifice, astfel: serverul asigur memorarea i manipularea datelor, precum i administrarea bazei de date, iar clientul asigur interfaa cu utilizatorul i lanseaz aplicaia care acceseaz datele din baza de date.

Figura 2.1 Arhitectura Oracle


Arhitectura Oracle se ncadreaz n tendinele actuale i anume este structurat pe trei niveluri: nucleul, interfeele i instrumentele de ntreinere. Nucleul Oracle conine componentele care dau tipul relaional pentru SGBD Oracle: limbajul relaional de regsire SQL i limbajul procedural propriu PL/SQL. Interfeele sunt componentele care permit dezvoltarea aplicaiilor cu BD. Instrumentele sunt componente destinate ntreinerii i bunei funcionri a unei BD Oracle.

1.1.1. ORACLE SERVER


Oracle Server (OS) permite managementul informaiilor organizate n baze de date, astfel nct se asigur accesul mai multor utilizatori n mod concurenial la aceleai date, oferind faciliti de prevenire a accesului neautorizat i de restaurare a datelor dup producerea unor erori. OS este un
6

sistem relaional-obiectual de management a bazelor de date, care permite o abordare deschis, integrat i cuprinztoare a managementului informaiilor. OS const dintr-un cuplu format dintr-o baz de date i o instan Oracle. A. O baz de date Oracle este o colecie unitar de date, avnd o structur logic i una fizic putnd avea doua stri: open (accesibil) i close (inaccesibil). 1) Structura logic ale unei baze de date este format din tabelele spaiu (tablespaces), schema de obiectelor bazei de date, blocurile de date, extensiile si segmentele. Tabelele spaiu sunt unitile logice de memorie n care este mprit o baz de date i pot fi tabele spaiu de sistem i tabele spaiu de utilizator. Fiierele de date sunt structurile de memorie specifice unui sistem de operare pe care rezid tabelele spaiu ale unei baze de date. Schema este o colecie de obiecte, iar schema de obiecte este o structur logic ce se refer direct la datele unei baze de date (tabele, vederi, secvene, proceduri memorate, sinonime, indecsi, clustere i link-uri de baz de date). Blocurile de date, extensiile i segmentele sunt elemente de control eficient al spaiului de memorie extern pe disc aferent unei baze de date. Blocul de date este unitatea de memorie cea mai mic manipulat de SGBD Oracle, iar marimea acestuia masurat n bytes se definete la momentul creerii bazei de date. Extensia este format din mai multe blocuri de date contigue. Segmentul este format din mai multe extensii. Segmentele pot fi: segmente de date (pentru memorarea datelor unei tabele), segmente de indecsi, segmente rollback (folosite pentru memorarea informaiilor necesare pentru recuperarea datelor unei baze de date sau anularea unei tranzacii) i segmente temporare (folosite pentru prelucrarea instruciunilor SQL). 2) Structura fizic este definit de un set de fiiere specifice sistemului de operare pe care rezid SGBD Oracle, folosite pentru memorarea structurilor logice ale bazei de date i pentru pstrarea unor informaii tehnice de control. Aceste fiiere sunt: fiiere de date (Data files), fiiere Redo log (Redo Log files) i fiiere de control (Control files). Fiierele de date (Data files) conin datele unei baze de date, sub forma structurilor logice ale acesteia (tabele, vederi, secvene, proceduri memorate, sinonime, indecsi, clustere i link-uri de baz de date). Fiierele Redo Log (Redo Log files) sunt folosite pentru memorarea tuturor schimbrilor de date produse asupra unei baze de date, astfel nct dac se ntmpl o cdere de curent s se previn distrugerea datelor bazei de date. Fiierele de control (Control files) sunt folosite pentru memorarea informaiilor necesare pentru controlul structurii fizice a unei baze de date (numele bazei de date, numele i locaiile fiierelor de date, data creerii bazei de date etc). B. Instana Oracle (Oracle instance) este combinaia logic dintre structurile de memorie intern (SGA - system global area, PGA program global area)i procesele Oracle de baz activate la momentul pornirii unei baze de date. 1) SGA este o regiune partajabil de memorie care conine datele i informaiile necesare unei instane Oracle. 2) PGA este zona de memorie care conine datele i informaiile de control ale unui proces server.

3) Procesul este un mecanism al sistemului de operare care poate executa o serie de pai (instructiuni).

CAPITOLUL 3. ELEMENTELE DE BAZ ALE LIMBAJULUI SQL


n 1992 ANSI (American National Standards Institute) a definitivat varianta standard a unui limbaj destinat sistemelor de gestiune a bazelor de date denumit Structured Query Language, prescurtat SQL. Frazele SQL permit crearea, actualizarea, interogarea i distrugerea bazelor de date relaionale. Desi toate S.G.B.D. folosesc SQL, adesea ele implementeaz si funcii care nu exist n standard. Comenzile de baz ale limbajului SQL care sunt Create, Alter, Select, Insert, Update, Delete i Drop sunt suportate de toate sistemele de gestiune de baze de date i permit realizarea tuturor activitilor majore legate de crearea i exploatarea bazelor de date relaionale. Cuvintele cheie ale limbajului SQL pot fi scrise att cu litere mici ct i cu majuscule. INTRODUCEREA COMENZILOR SQL FOLOSIND INTERFAA GRAFIC

1.

Dup conectare se selecteaz SQL Commands / Enter Command.

Comenzile introduse n fereastra SQL Commands pot fi terminate prin ';' ca n MySQL de exemplu sau se poate chiar omite caracterul terminal. Astfel pentru suprimarea tabelului cafea se poate scrie: drop table cafea; sau pur si simplu drop table cafea efectul fiind acelai. Comenzile SQL pot fi memorate individual apsnd butonul Save:

Comenzile memorate pot fi reexecutate prin selectare cu mouse-ul (dublu clic):

1.1.

TIPURI DE DATE SUPORTATE DE ORACLE a. iruri de caractere

Oracle defineste patru tipuri de date: - VARCHAR2 - pentru iruri de caractere de lungime variabil, - NVARCHAR2 pentru iruri de caractere de lungime variabil n format UNICODE (16 bii / caracter), - CHAR - pentru iruri de caractere avnd lungime fix, - NCHAR - pentru iruri de caractere avnd lungime fix, n format UNICODE. Indiferent de tip, la declararea unui cmp trebuie precizat lungimea: nume varchar2(50) Pentru VARCHAR2 lungimea specificat este cea maxim admis n timp ce pentru CHAR ea va fi efectiv utilizat, irurile de lungime mai mic fiind completate la dreapta cu spaii. Rezult c VARCHAR2 este mai eficient. b. Date numerice Datele numerice pot fi declarate n Oracle folosind unul dintre tipurile urmtoare: - NUMBER - pentru numere zecimale, - BINARY_FLOAT - pentru numere reale (memorate fr conversie n baza 10) - BINARY_DOUBLE- pentru numere reale n dubl precizie (memorate fr conversie). Cel mai frecvent se foloseste tipul NUMBER. Pentru declararea unei date de tip NUMBER se poate scrie: nlime number(3) sau, nlime number(3,0) Pentru numere care au o parte ntreag i una zecimal se scrie: pret NUMBER(7,2) nsemnnd reprezentarea cmpului pret folosind 7 poziii zecimale, ultimele dou fiind folosite pentru partea real. BINARY_FLOAT i BINARY_DOUBLE sunt tipuri recomandate n cazul n care datele astfel reprezentate sunt folosite la calcule mai complicate. c. Tipuri pentru timp i dat calendaristic Pentru declararea cmpurilor care vor pstra data calendaristic sau timpul, Oracle folosete tipurile DATE i TIMESTAMP.

10

d. Tipuri pentru memorarea imaginilor Pentru declararea cmpurilor destinate pstrrii n baza de date a imaginilor, Oracle foloseste tipurile CLOB sau BLOB. 1.1.1. CREAREA TABELELOR N ORACLE XE

Comanda CREATE TABLE


Comanda CREATE TABLE servete la crearea unui nou tabel i la descrierea cmpurilor acestuia. Ea are formatul general: CREATE TABLE nume (nume_cmp tip_cmp [(marime [,precizie])] [NULL | NOT NULL] [PRIMARY KEY | UNIQUE] [,nume_cmp tip_cmp [(marime [,precizie])] [NULL | NOT NULL] )

Crearea tabelelor va fi realizat mai uor folosind interfaa serverului Oracle XE. n cazul n care n momentul crerii unui tabel se impun restricii asupra cmpurilor, se declar chei strine sau se declar o cheie primar, fraza SQL corespunztoare va conine un numr de restricii introduse folosind cuvntul rezervat "constraints".

CREATE TABLE "DEMO_ORDERS" ( "ORDER_ID" NUMBER NOT NULL ENABLE, "CUSTOMER_ID" NUMBER NOT NULL ENABLE, "ORDER_TOTAL" NUMBER(8,2), "ORDER_TIMESTAMP" DATE, "USER_ID" NUMBER, CONSTRAINT "DEMO_ORDER_PK" PRIMARY KEY ("ORDER_ID") ENABLE, CONSTRAINT "DEMO_ORDER_TOTAL_MIN" CHECK (order_total >= 0) ENABLE, CONSTRAINT "DEMO_ORDERS_CUSTOMER_ID_FK" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "DEMO_CUSTOMERS" ("CUSTOMER_ID") ENABLE,
11

CONSTRAINT "DEMO_ORDERS_USER_ID_FK" FOREIGN KEY ("USER_ID") REFERENCES "DEMO_USERS" ("USER_ID") ENABLE ) n fraza SQL afiat denumirile cmpurilor, constrngerilor sau denumirea tabelului apar ntre ghilimele. Aceast scriere permite folosirea de denumiri coninnd spaii (de evitat!). Dac denumirile nu pot da natere la confuzii, ghilimelele pot fi omise. Cele patru constrngeri declarate se refer la cheia primar, limitarea unei valori i declar dou cmpuri ca fiind chei strine, preciznd i tabelele legate. n primul exemplu cheia primar a fost declarat adugnd descrierii cmpului ID_regiune cuvintele PRIMARY KEY.

Comanda DROP TABLE Comanda DROP TABLE permite suprimarea unui tabel. Sintaxa comenzii este: DROP TABLE Nume_tabel Pentru a da comanda folosind interfaa grafic se selecteaz succesiv Object Browser / Browse / Tables, se selecteaz apoi tabelul i se apas butonul Drop:

Comanda SELECT

12

Comanda SELECT creeaz o mulime de selecie. Aceasta poate conine un articol, mai multe articole sau niciunul. Articolele din mulimea de selecie conin numai cmpurile indicate de programator. Din acest punct de vedere se poate considera c SELECT creaz un subtabel coninnd numai informaiile specificate. Cmpurile nregistrrilor mulimii de selecie pot proveni dintr-un tabel sau din mai multe tabele legate. Comanda SELECT are formatul general: SELECT [DISTINCT] coloana1 [,coloana2] FROM tabel_1[,tabel_2, ...] [WHERE condiii] [GROUP BY list-coloane] [HAVING conditii] [ORDER BY list-coloane [ASC | DESC] ] Dintre cele 5 clauze ale comenzii SELECT numai clauza FROM este obligatorie. Fiecare dintre clauze are la rndul ei reguli i parametri pentru construcie, fcnd din SELECT cea mai complex comand a limbajului SQL. n frazele SELECT irurile de caractere se pun ntre caractere ' (apostrof). A. Selectarea dintr-un singur tabel Exemple fundamentale: SELECT Nume, Prenume FROM cititor SELECT * FROM cititor SELECT * FROM cititor WHERE nume = 'Popescu' SELECT nume, prenume, adresa FROM cititor WHERE nume LIKE 'Po%' SELECT Nume, Prenume FROM cititor ORDER BY Nume Clauza WHERE permite limitarea mulimii de selecie prin introducerea unei condiii care specific nregistrrile cutate. n cazul selectrii din mai multe tabele, aceast clauz poate fi folosit si pentru a introduce legturile dintre tabele. La scrierea condiiei se pot folosi operatorii logici AND, OR sau NOT precum si operatorii relaionali: = Egal > Mai mare < Mai mic >= Mai mare sau egal <= Mai mic sau egal <> sau != Diferit de LIKE - LIKE permite selectarea liniilor care conin n cmpul testat iruri de caractere n care se regsete o succesiune de caractere precizat. Pentru definirea succesiunii de caractere cutat se poate folosi caracterul generic "%". De exemplu clauza WHERE nume LIKE 'Po%' va permite selectarea liniilor n care nume = Pop i nume=Popescu. Clauza WHERE prenume LIKE '%a' permite selectarea tuturor liniilor n care prenumele se termin n "a". Exemple: SELECT * FROM cititor WHERE nume = 'Popescu' AND prenume='Mihai' SELECT * FROM cititor WHERE nume = 'Popescu' OR nume='Mihai' SELECT * FROM cititor WHERE nume = 'Popescu' AND prenume IN('Ioan','Vasile','Grigore') IN specific o mulime creia trebuie s-i aparin cmpul specificat (prenume). SELECT * FROM cititor WHERE nume = 'Popescu' AND data_naterii BETWEEN '12-MAY-1968' AND '29-MAY-1980'

13

Clauza BETWEEN permite definirea unui interval cruia trebuie s-i aparin cmpul specificat (data_naterii). Clauza ORDER BY servete la impunerea ordinii de afiare a nregistrrilor mulimii de selecie. Ordonarea poate fi realizat dup valorile unuia sau a mai multor cmpuri, cresctor (ASC) sau descresctor (DESC). n cazul n care se folosesc mai multe cmpuri, acestea sunt separate prin virgul. SELECT * FROM Cititor ORDER BY Nume,Prenume,ID_cititor SELECT * FROM Angajati ORDER BY salar DESC, Nume ASC, Prenume ASC Clauza DISTINCT permite realizarea unei mulimi de selecie care conine nregistrri distincte, care difer prin cel puin o valoare a unui cmp. De exemplu : SELECT DISTINCT Localitate FROM cititor Ultima fraz va provoca afisarea numelor localitilor n care domiciliaz cititorii. Fr clauza DISTINCT, numele orasului Cluj-Napoca ar fi fost repetat de mai multe ori. Clauza GROUP BY permite gruparea nregistrrilor dup valoarea unui cmp. Exemplul 1: SELECT Localitate, COUNT(*) as Nr_Cititori FROM Cititor GROUP BY Localitate n cazul n care se realizeaz o grupare, fiecare dintre liniile mulimii de selecie se refer la un grup de nregistrri i nu la nregistrri simple. n exemplul precedent, GROUP BY Localitate precizeaz cmpul dup care se realizeaz gruparea. nafara valorii cmpului dup care se face gruparea, n astfel de situaii liniile mulimii de selecie pot conine rezultatul aplicrii unor funcii matematice asupra articolelor care formeaz grupul (suma valorilor dintr-un cmp, media valorilor, valoarea maxim sau minim, numrul de articole care formeaz grupul etc). Pentru cmpurile care vor conine rezultatul aplicrii unor funcii se recomand folosirea clausei AS nume pentru atribuirea unui nume relevant coloanei respective. n exemplul dat s-a afiat rezultatul funciei COUNT(*), care numr nregistrrile din grup. Funciile care pot fi apelate pentru cmpuri numerice sunt prezentate n tabelul de mai jos. MIN returneaz cea mai mic valoare dintr-o coloan (cmp numeric) MAX returneaz cea mai mare valoare dintr-o coloan (cmp numeric) SUM returneaz suma valorilor numerice dintr-o coloan (cmp numeric) AVG returneaz media valorilor dintr-o coloan (cmp numeric) COUNT returneaz numrul de valori dintr-o coloan COUNT DISTINCT returneaz numrul de valori distincte dintr-o coloan Exemplul 2: SELECT Sectie, MAX(salar) as Sal_Max FROM Angajati GROUP BY Sectie Se pot ns aplica aceleai funcii i ntregului fiier, fr gruparea articolelor, caz n care mulimea de selecie va conine o singur nregistrare: SELECT AVG(salar) FROM Angajai SELECT AVG(salar) FROM Angajai WHERE funcie='Zidar' SELECT COUNT(*) FROM Cititor Clauza HAVING servete la precizarea unui filtru care se aplic grupurilor de articole, dac este prezent clauza GROUP BY. Exemplu:

14

SELECT Sectie, AVG(Salar) FROM Angajai GROUP BY Secie HAVING AVG(Salar) > 500 Dac n fraza SELECT lipsete clauza GROUP BY, folosirea clauzei HAVING nu se justific, ea avnd acelai efect ca i clauza WHERE. O situaie aparte prezint comenzile SELECT care nu realizeaz o mulime de selecie ci un calcul matematic. n acest caz from nume_tabel va fi nlocuit prin from dual, ca n exemplul urmtor:

Cuvntul rezervat dual astfel folosit permite respectarea sintaxei comenzii SELECT. B. Selectarea din mai multe tabele Principial o baz de date relaional presupune repartizarea datelor n mai multe tabele. Aa cum s-a vzut deja, acest mod de stocare permite eliminarea informaiilor redondante. Pentru a gsi articolele dintr-un tabel legate de o nregistrare din alt tabel trebuie ns indicat n frazele SELECT condiia de legtur dintre cele dou tabele. Exemple: SELECT Edituri.Nume, Carti.Titlu, Carti.Anul FROM Edituri, Carti WHERE Nume='Minerva' AND Edituri.CodE=Carti.CodE A doua condiie coninut n clauza WHERE este cea care leag tabelele Edituri si Carti. Limbajul SQL permite nlocuirea unei mulimi care contribuie la selecie printr-o alt fraz SELECT, ca n exemplul urmtor. SELECT Edituri.Nume, Carti.Titlu, Carti.Anul FROM Edituri, Carti WHERE Nume='Minerva' AND Edituri.CodE=Carti.CodE AND Titlu.Data IN (SELECT Data FROM Carti WHERE Data BETWEEN '12-MAY-1975' AND '29-MAY-1980') Odat cu standardizarea limbajului SQL, pentru introducerea legturilor stabilite ntre tabele prin definirea de chei primare i strine s-a definit i o alt modalitate, respectiv clauza JOIN. Folosind JOIN, exemplul anterior poate fi scris astfel: SELECT Edituri.Nume, Carti.Titlu, Carti.Anul FROM Edituri INNER JOIN Carti ON Edituri.CodE=Carti.CodE WHERE Nume='Minerva'

15

Clauza JOIN este ns i soluie ntr-o alt situaie, respectiv cnd ntr-un tabel se accept pentru o cheie strin valori nule. Un exemplu simplu este cel al tabelelor Angajati i Soti prezentate n continuare.

Dintre angajaii din primul tabel doi sunt cstorii, n cazul lor ID_SOT are valori nenule. Dac se doreste realizarea unei mulimi de selecie care s cuprind angajaii, iar pentru cei cstorii numele i prenumele soului/soiei, fraza SELECT ar putea fi urmtoarea: select Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume from Angajati, Soti where Angajati.ID_SOT=SOTI.ID_SOT Rezultat:

Rezultatul nu este cel dorit deoarece prin condiia pus sunt exclui din mulimea de selecie angajaii necstorii. Soluia este oferit de clauza LEFT OUTER JOIN: select Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume from Angajati left outer join Soti on Angajati.ID_SOT=SOTI.ID_SOT Rezultatul va cuprinde toate liniile din primul table, iar pentru liniile din primul tabel care au corespondent n al doilea tabel, va include i informaiile corespunztoare din al doilea tabel.

16

Similar se poate folosi clauza RIGHT OUTER JOIN pentru includerea tuturor nregistrrilor din al doilea tabel i selectarea din primul doar a celor care satisfac relaia de legtur. C. Utilizarea parametrilor SQL permite ca la scrierea comenzii SELECT s se foloseasc parametrii. Valorile acestora sunt cerute ntr-o fereastr separat, n momentul executrii interogrii. Exemplu : sql>select * from edituri where cod_edit > :coded;

17

Comanda INSERT Comanda INSERT adaug un rnd ntr-un tabel existent.

Exemplu: INSERT INTO Edituri(CodE,Nume,Adresa,Telefon) VALUES(121, 'Albatros','B-dul Tomis Nr. 32 Constanta','0745654765') Lista de cmpuri de dup numele tabelei poate fi omis dac toate cmpurile primesc valori, iar acestea sunt scrise n ordinea definit la creare (n care ele apar n capul de tabel). Dac un cmp nu primete valoare el va primi implicit valoarea NULL, dac la creare, prin modul de declarare a cmpului, introducerea unei astfel de valori este autorizat. Comanda DELETE Comanda DELETE suprim una sau mai multe nregistrri dintr-un fiier. Ca i n cazul comenzii SELECT, pentru definirea unui set de nregistrri care vor fi terse se utilizeaz clauza WHERE. Exemplu: DELETE FROM Autori WHERE CodAut=7 DELETE FROM Edituri Ultima comand suprim toate nregistrrile din tabelul Edituri. Comanda UPDATE Comanda UPDATE permite modificarea unei nregistrri sau a unui set de nregistrri. Pentru precizarea setului de nregistrri afectate se foloseste clauza WHERE. Exemplu: UPDATE Edituri SET Adresa='str. 1 Mai Nr. 12', Telefon='0745343435' WHERE Nume='Dacia' UPDATE Angajati SET Salar=Salar*1.2 WHERE Salar<450

18

CAPITOLUL 4. ORACLE JDBC


1. GENERALITI

Pentru scrierea aplicaiilor care acceseaz serverul Oracle XE o soluie bun este limbajul Java. De altfel firma Oracle Co. pune la dispoziia utilizatorilor mediul JDeveloper care posed multiple faciliti n acest sens. n cele ce urmeaz se va folosi mediul de programare Netbeans. JDBC (Java DataBase Connectivity) este o colecie de clase care permite unei aplicaii client scris n Java s acceseze un server de baze de date relaionale. Folosind aceste clase o aplicaie poate s se conecteze la serverul de baze de date, poate trimite comenzi SQL i poate prelucra rezultatele furnizate de server ca urmare a executrii aciunilor comandate. Spre deosebire de ODBC (Open DataBase Connectivity colecie de proceduri scrise n C i dependente de sistemul de operare), colecia de clase coninute n JDBC este scris n Java fiind astfel realizat independena fa de sistemul de operare. Fiierele surs care folosesc clase din JDBC trebuie s includ pachetul java.sql. Pentru fiecare server de baze de date exist implementri specifice ale JDBC. Astfel n cazul accesrii serverului Oracle XE proiectului aplicaiei client trebuie s i se adauge una dintre arhivele .jar. existente n directorul [ORACLE_HOME]\jdbc\lib. Dac instalarea serverului Oracle XE s-a fcut n C:, atunci [ORACLE_HOME] este:

1.1.

PRINCIPALELE CLASE DIN JDBC Clasa Connection

Pentru a accesa serverul Oracle XE, clasa principal a aplicaiilor care vor fi realizate va conine un obiect din clasa Connection. Crearea sa va fi sistematic realizat folosind secvena de cod urmtoare: try { OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:biblio/bibpas@193.226.7.210:1521/XE"); cnx = ods.getConnection(); // cnx apartine clasei Connection } catch ( SQLException sqlException ) { System.out.println("Conectare imposibila."); System.exit( 1 ); } irul de caractere subliniat conine schema (biblio), parola (bibpas), IP-ul serverului pe care ruleaz Oracle XE (193.226.7.210) i portul pe care se va realiza conectarea (1521). naintea ncheierii aplicaiei este necesar nchiderea conexiunii prin apelul metodei close() a acesteia: cnx.close(); Clasa Statement Pentru a trimite comenzi SQL individuale serverului de baze de date este necesar crearea unui obiect din clasa Statement. Crearea obiectului se realizeaz prin apelul metodei createStatement() a clasei Connection :
19

Statement stmt1 = cnx.createStatement() ; sau Statement stmt2 = cnx.createStatement(tip, acces) ; Dac va fi folosit pentru trimiterea de comenzi SQL select, obiectul stmt1 va permite crearea unor mulimi de selecie care vor putea fi parcurse doar dinspre primul element spre ultimul, nu i n sens invers. Dac se doreste crearea ulterioar a unor mulimi de selecie care pot fi parcurse n ambele sensuri se va utiliza variant metodei createStatement() cu doi parametri. Primul parametru, tip, va avea una dintre valorile urmtoare: ResultSet.TYPE_FORWARD_ONLY, care indic faptul c mulimea de selecie creat ulterior va putea fi parcurs doar nainte, ResultSet.TYPE_SCROLL_INSENSITIVE, care permite realizarea unei mulimi de selecie care va putea fi parcurs n ambele sensuri dar nu va reflecta modificrile operate de ali utilizatori pe tabelele folosite la interogare. Al doilea parametru, acces, poate lua valorile: ResultSet.CONCUR_READ_ONLY semnificnd faptul c mulimile de selecie care vor fi realizate nu vor putea fi folosite la actualizarea datelor din tabele (nu se vor putea folosi la trimiterea de comenzi update) sau ResultSet.CONCUR_UPDATABLE care indic faptul c mulimile de selecie realizate ulterior folosind stmt2 vor putea servi la actualizarea datelor din tabelele folosite la interogare (corectare, inserare de noi linii). Dup crearea unui obiect din clasa Statement acesta va putea fi folosit pentru a apela metoda executeQuery() (pentru a trimite serverului comenzi SELECT) sau metoda executeUpdate() (pentru a trimite serverului comenzi CREATE, UPDATE, INSERT sau DELETE). Metoda executeQuery() returneaz o mulime de selecie n timp ce metoda executeUpdate() returneaz un numr ntreg reprezentnd numrul nregistrrilor afectate de comanda SQL dat. Dup ncheierea folosirii sale, obiectul Statement trebuie suprimat prin apelul metodei close(). stmt.close(); Clasa ResultSet Un obiect din clasa ResultSet conine o mulime de selecie furnizat de serverul de baze de date ca urmare a executrii unei comenzi de interogare (SELECT). Pentru parcurgerea liniilor mulimii de selecie un ResultSet integreaz un cursor care indic linia curent a mulimii. Iniial, dup executarea interogrii, cursorul este poziionat naintea primei linii. Pentru a avansa pe o nou linie se foloseste metoda next() . Deoarece metoda next() returneaz null la terminarea liniilor mulimii de selecie, aceasta permite scrierea uoar a unui ciclu de parcurgere a liniilor mulimii de selecie. try { Statement stmt = cnx.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Edituri order by nume"); while ( rs.next() ) { System.out.println( rs.getString("nume") ); } stmt.close(); } catch (SQLException ex) {} Un obiect din clasa ResultSet este iniializat prin executarea metodei executeQuery() a clasei Statement. Dac crearea s-a fcut ca mai sus, mulimea de selecie poate fi parcurs doar nainte, apelnd metoda .next(). Dac mulimea de selecie trebuie s fie parcurs n ambele sensuri se va
20

folosi varianta cu parametri a metodei createStatement(): Statement stmt = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ON LY ) ; Dup crearea unei mulimi de selecie care poate fi parcurs n ambele sensuri, aceasta va putea fi parcurs folosind metodele: first() pentru trecerea pe prima linie, last() pentru trecere pe ultima linie, next() pentru trecere pe urmtoarea linie sau previous() pentru trecerea pe linia precedent absolute(nr) pentru plasarea cursorului pe linia nr a mulimii de selecie. Valoarea unui cmp al liniei curente din mulimea de selecie se obine apelnd una dintre metodele JDBC get*() din tabelul de mai jos. O metod get*() poate avea ca argument fie un numr ntreg care specific a cta valoare trebuie extras, fie un ir de caractere coninnd numele cmpului. La specificarea numelui cmpului nu conteaz cu ce caractere este scris - litere mici sau majuscule. La scrierea metodelor get*() avnd argument numeric se va ine cont de faptul c numerotarea cmpurilor liniei curente din mulimea de selecie ncepe cu valoarea 1. Dac tabelul edituri are dou cmpuri, Cod_edit si Nume, pentru exemplul dat acelasi rezultat se putea obine deci scriind : System.out.println( rs.getString(2) );

O mulime de selecie poate servi la actualizarea datelor din tabele folosite la crearea ei. Pentru aceasta obiectul de tip Statement folosit la trimiterea comenzii select trebuie declarat astfel: Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); Corectarea datelor din tabele se realizeaz ca n exemplul urmtor: ResultSet rs = stmt.executeQuery("SELECT * FROM Edituri order by nume"); rs.absolute(5); // mut cursorul pe a linia 5 din rs rs.updateString("NUME", "Teora"); // corecteaza cmpul NUME rs.updateRow(); // se trimite sursei de date linia 5 Pentru inserarea unei noi linii folosind o mulime de selecie se va folosi o linie creat n acest scop prin apelul metodei moveToInsertRow(). n aceast linie pot fi apoi adugate valorile dorite folosind metode update*() (updateInt(), updateString() etc). Exemplu: rs.moveToInsertRow(); // mut cursorul pe linia suplimentar creat rs.updateInt(1, "23"); // impune valoarea pt. primul cmp rs.updateString(2,"Casa cartii"); // idem, cmpul 2
21

rs.insertRow(); rs.moveToCurrentRow(); Un ResultSet este nchis prin apelul metodei close() sau automat, la nchiderea obiectului Statement folosit la crearea sa respectiv la reconstruire (reexecutarea interogrii).

Clasa PreparedStatement Deoarece trimiterea efectiv a unei comenzi SQL folosind un obiect din clasa Statement presupune derularea n prealabil a unui proces de analiz sintactic i de construire a unei comenzi acceptate de serverul de baze de date, n cazul trimiterii repetate a aceleiasi comenzi SQL se poate ctiga timp dac procesul de pregtire menionat se deruleaz o singur dat pentru tot setul de comenzi. Pentru a realiza acest lucru este necesar ns ca n locul obiectului din clasa Statement s se declare un obiect din clasa nrudit PreparedStatement. Exemplu: PreparedStatement ps = cnx.prepareStatement("INSERT INTO Edituri VALUES(?,?)"); ps.setInt(1, 12); ps.setString(2, "Minerva"); ps.executeUpdate(); ps.setInt(1, 13); ps.setString(2, "Orizonturi"); ps.executeUpdate(); ps.setInt(1, 14); ps.setString(2, "Dacia"); ps.executeUpdate(); ps.close; irul de caractere care conine comanda care urmeaz s fie executat repetat poate conine caractere '?' care indic poziiile pe care vor fi inserate valori noi naintea reapelrii metodei executeUpdate() (sau executeQuery(), dup caz). Clasa CallableStatement Un obiect de tip CallableStatement permite lansarea n execuie a unei proceduri stocate (scris n PL SQL de exemplu). Crearea unui obiect din clasa CallableStatement se realizeaz ca n exemplele urmtoare: a. Procedur stocat fr parametri: CallableStatement cs = cnx.prepareCall("{call procst}"); b. Procedur stocat avnd 2 parametri: CallableStatement cs = cnx.prepareCall("{call procstoc(?, ?)}"); cs.setString(1,theuser); cs.setString(2,password); cs.executeQuery(); c. Procedur avnd doi parametri de intrare, unul de iesire si care returneaz o mulime de selecie CallableStatement cs = cnx.prepareCall("{call proc3p(?,?,?)}"); cs.setString(1,theuser);
22

cs.setString(2,password); cs.registerOutParameter(3,Types.DATE); cs.executeQuery(); Date dataconect = cs.getDate(3);

CAPITOLUL 5. REALIZAREA INTERFEEI APLICAIEI - PARTEA PRACTIC


1. Se pornete mediul de programare (NetBeans 6.7.1 IDE sau o versiune ulterioar) ;
2. Se demareaz un nou proiect (File / New Project ... sau se apas butonul

3. Se defineste numele proiectului (Sanatate), se deselecteaz caseta de validare Create Main Class i se apas Finish. Deselectarea casetei Create Main va opri crearea unei clase principale.

23

Aplicaia care trebuie realizat avnd interfa grafic, este mai simplu s se creeze ulterior o clas, derivat din clasa Jframe, pe care mediul de programare o va creea ca principal (va conine main()). 4. Se adaug proiectului arhiva ojdbc14_g.jar:

24

Paii realizai asigur crearea pe disc a unei structuri de directoare care vor conine fiierele proiectului. Proiectul nu conine nc nici o clas, n arborele acestuia figurnd intrarea Source Packages cu o entitate, <default package>.

Crearea ferestrei principale


O aplicaie care acceseaz un server de baze de date are caracteristicile unei aplicaii Windovs obinuite, respectiv afieaz o fereastr principal care conine o bar cu meniuri derulante, o bar cu instrumente pentru comenzi rapide i o zon grafic de afiare.

25

Crearea interfeei aplicaiei va ncepe cu crearea unei clasei principale. n aplicaiile scrise n Java aceasta poart numele proiectului i conine metoda static main(). Clasa principal va fi declarat ca derivat din clasa JFrame. O instan a clasei principale, creat n cadrul metodei statice main(), va putea atunci servi drept container principal al aplicaiei (Window frame n figur). Pentru crearea acestei clase se procedeaz astfel: - n meniul File se selecteaz New File :

n fereastra care se afieaz se introduce numele noii clase. Fiind clasa principal a aplicaiei, ea va purta numele proiectului, sanatate. n fereastra New JFrame Form este bine s se indice de asemenea numele unui nou pachet care va nlocui pachetul implicit i va coine fiierele surs ale aplicaiei.

26

Pentru a da un titlu ferestrei se va selecta un punct din fereastr i se va modifica proprietatea title. Prin demersuri oarecum asemntoare vor fi adugate ferestrele de dialog care vor conine formularele i rapoartele necesare exploatrii bazei de date Oracle XE. Pentru a impune poziia n care se va afia fereastra creat se va selecta fereastra (clic dreapta) i n meniul contextual se va selecta succesiv Events / Window / windowActivated.

Mediul de dezvoltare va genera metoda formWindowActivated() care va fi modificat astfel:

27

n aceast etap se poate testa aplicaia precum si posibilitatea conectrii la serverul Oracle XE. Pentru aceasta se va proceda astfel: - Se insereaz la nceputul fisierului sanatate.java liniile: import java.sql.*; import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource; Aceste linii sunt inserate i de mediul de programare dac se include codul care conine declaraii ale unor obiecte aparinnd unor clase declarate n aceste pachete: Connection, ResultSet, Statement etc.. Dup declararea obiectelor se selecteaz cu butonul drept un punct din fereastra de editare i n meniul contextual se selecteaz Fix Imports.

Mediul de programare va afia o fereastr n care va arta ce pachete va include. Pentru cazurile n care exist mai multe soluii se va alege varianta din figur.

28

- Se adaug clasei principale variabila cnx de tip Connection. Pentru aceasta se merge n codul surs la sfrit, n zona de declaraii de variabile i se tasteaz declaraia:

- Se completeaz constructorului clasei Biblio cu liniile necesare crerii obiectului cnx. n prima

faz unele linii vor fi evideniate ca fiind eronate. Mediul de programare cere ca toate liniile legate de accesarea unei baze de date s fie integrate n secvene try - catch.

Mediul poate ns adauga automat secvena try - catch corespunztoare. Pentru aceasta se selecteaz cu butonul stng al mouse-ului unul dintre mesajele de eroare i apoi se selecteaz Surround Block with try-catch. Rezultat: public sanatate() { try { OracleDataSource ods = new OracleDataSource();
29

ods.setURL("jdbc:oracle:thin:sanatate/sanatate@localhost:1521/XE"); cnx = ods.getConnection(); System.out.println("Conectare Ok"); initComponents(); } catch (SQLException ex) { Logger.getLogger(sanatate.class.getName()).log(Level.SEVERE, null, ex); } } Liniile evideniate realizeaz iniializarea variabilei cnx. Aceasta va fi folosit n continuare pentru accesul la baza de date. n continuare se poate lansa aplicaia n execuie. Dac nu sunt incidente legate de conectarea la serverul de baze de date, aplicaia va afia fereastra principal (goal!), iar n regiunea mediului de programare afectat consolei va aprea irul de caractere "Conectare Ok".

Realizarea formularelor
Accesul la datele coninute ntr-o baz de date se realizeaz prin formulare i rapoarte. Formularele asigur urmtoarele funcii principale : Afieaz date individuale; Permit modificarea datelor afiate; Permit suprimarea articolelor ; Permit adugarea unui articol. Rapoartele prezint ntr-un format impus date coninute n baza de date. n unele cazuri formatul n care datele trebuie prezentate datele este definit prin lege. Aplicaia trebuie s asigure afiarea pe ecran i imprimarea rapoartelor.

Controale Windows
Formularele prin care sunt accesate datele coninute ntr-o baz de date pot fi destinate realizrii unei funcii elementare (afiare date, modificare, adugare etc.) sau pot realiza o funcie complex. Un formular destinat realizrii unei funcii complexe conine un mare numr de controale Windows, n anumite stri ale aplicaiei putndu-se pune chiar problema ascunderii unora dintre ele. O aplicaie care conine formulare simple, fiecare destinat realizrii unei aciuni elementare, poate pune probleme de operare, dar practica programrii recomand aceast abordare deoarece att depanarea ct i ntreinerea aplicaiilor astfel concepute este mai simpl.

JMenuBar
Iniierea diferitelor aciuni se realizeaz n principal folosind meniuri derulante i butoane. Meniurile derulante vor declana principalele funcii ale aplicaiei (afiarea formularelor i rapoartelor, salvarea bazei de date, oprirea aplicaiei), iar butoanele vor declansa aciuni n interiorul formularelor. Pentru a defini meniul unei aplicaii trebuie creat o bar de meniuri (obiect aparinnd clasei JMenuBar), un ansamblu de meniuri derulante (obiecte de tip JMenu) i pentru fiecare meniu derulant, un ansamblu de opiuni (obiecte aparinnd clasei JMenuItem). Pentru a realiza o aplicaie care acceseaz baza de date Oracle XE, schema Sanatate, se va proceda astfel: a. Se adaug proiectului bara cu meniuri derulante:
30

Se va selecta cu mouse-ul Menu Bar i se va realiza adugarea sa printr-un clic cu mouse-ul n fereastra aplicaiei.

n continuare se va edita coninutul barei cu meniuri folosind reprezentarea arborescent afiat prin selectarea tabului Inspector. b. Se modific numele primului meniu derulant (proprietatea text):

c. Se adaug meniului Operaii opiunea Iesire. Efectul selectrii acesteia va fi oprirea aplicaiei. Pentru a iniia adugarea noii opiuni se selecteaz cu butonul drept al mouse-ului meniul Operaii i apoi se selecteaz n meniul contextual Add From Palette / Menu Item.

31

Rezultat:

Se modific apoi proprietatea text a opiunii nou adugate n Iesire:

d. Se editeaz apoi al doilea meniu de pe bara cu meniuri derulante. Se modific proprietatea text a noului obiect din Edit n Formulare:

32

Celui de-al doilea meniu derulant i se vor aduga n timp mai multe intrri, fiecare avnd rolul de a declana afiarea unuia dintre formularele care vor fi realizate. n acelai mod va fi adugat aplicaiei un al treilea meniul derulant, Rapoarte, ale crui intrri vor fi folosite pentru a declansa afiarea rapoartelor. Pentru a creea metoda care trebuie executat la selectarea unei opiuni dintr-un meniu derulant se va selecta opiunea cu un dublu clic n fereastra Inspector sau se va selecta opiunea n fereastra Design cu butonul drept al mouse-ului i n meniul contextual se va selecta Events / Action / actionPerformed.

Pentru opiunea Iesire din primul meniu derulant funcia astfel adugat trebuie completat cu secvena de cod care nchide conexiunea cu serverul i apoi apeleaz metoda System.exit(0) a crui efect este oprirea imediat a aplicaiei. private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { try { // TODO add your handling code here: cnx.close(); } catch (SQLException ex) { Logger.getLogger(sanatate.class.getName()).log(Level.SEVERE,null, ex); } System.exit(0); } Secvena try-catch a fost adugat de mediul de programare. Practic s-a scris cnx.close(); dup care s-a selectat cu mouse-ul simbolul care indica o eroare i s-a selectat opiunea Surround Statement with try-catch.

33

JLabel Controlul de tip JLabel servete la plasarea ntr-un formular a unui text sau a unei imagini. Dup includerea controlului trebuie setate principalele proprieti ale acestuia, respectiv text sau icon pentru definirea coninutului, font, foreground, background s.a.

Proprietile icon i text se pot folosi mpreun. Dac se selecteaz icon trebuie indicat fiierul care conine imaginea de afiat, aceasta fiind n format JPEG (Joint Photographic Experts Group, avnd extensia .jpg) sau GIF (Graphics Interchange Format avnd extensia .gif).

34

JTextField

Controlul de tip JTextField, este folosit la afiarea sau introducerea irurilor de caractere. Accesul la coninutul unui control de tip JTextField se realizeaz cu perechea de metode setText() (impunere String coninut) i getText() (preluare String coninut) ca n exemplul urmtor: nume_spital.setText(nm); ... String nume = nume_spital.getText(); Exemplu : S se adauge aplicaiei un formular care permite navigarea n tabelul Spitale. Pentru navigare se vor folosi dou butoane avnd pentru proprietatea text valoarea Inainte respectiv Inapoi. Rezolvare: n NetBeans soluia rapid pentru adugarea unei ferestre de dialog const n selectarea succesiv cu mouse-ul a butonului JDialog din fereastra Palette i a ferestrei principale (sau, mai general, fereastra aplicaiei n cadrul creia se va afia noua fereatr). Dup adugarea ferestrei de dialog se ncepe configurarea acesteia. Prima operaie va fi schimbarea numelui implicit din jDialog1 n spitale. Pentru aceasta se selecteaz cu butonul drept al mouse-ului n fereastra Inspector noua fereastr si apoi, n meniul contextual, se selecteaz Change Variable Name...

35

Pentru a edita coninutul ferestrei de dialog se selecteaz cu un dublu clic n fereastra Inspector identificatorul acesteia:
dublu clic

Ca i n cazul ferestrei principale, pentru a impune un titlu care se va afia pe bara ferestrei se selecteaz cu mouse-ul un punct din fereastr i se scrie titlul dorit n dreptul proprietii Title. Folosind instrumentele din fereastra Palette, se adaug noii ferestre cinci controale Windows: o etichet (JLabel avnd text=Nume), o caset de text (JTextBox avnd Name=numespit) i trei butoane avnd numele spitprec, spiturm respectiv ies i proprietile text ca n figura urmtoare:

Pentru a modifica etichetele butoanelor se acceseaz proprietatea text a acestora sau se selecteaz controlul cu butonul stng al mouse-ului i se selecteaz Edit Text n meniul contextual.

nainte de a continua cu scrierea secvenelor de cod necesare funcionrii noii ferestre se va verifica n fereastra Inspector corecitudinea configurrii.

36

Deoarece rolul acestui formular este parcurgerea tabelului Spitale, clasei principale i se va aduga un obiect din clasa ResultSet denumit rez. Acesta va fi iniializat ntr-o secven de cod executat la deschiderea formularului i va fi nchis (se va apela metoda close()) la nchiderea acestuia. De asemenea se va aduga clasei principale obiectul comanda aparinnd clasei Statement. Acesta va permite crearea obiectului rez care va conine mulimea de selecie rezultat n urma executrii de ctre serverul Oracle XE a comenzii SQL de selectare a editurilor din baza de date. Zona din codul clasei destinat declaraiei variabilelor clasei va conine deci variabilele urmtoare: private Connection cnx; private Statement rez; private ResultSet comanda; Pentru a realiza aciuni naintea afirii unei ferestre (JFrame sau JDialog) este necesar adugarea unei metode asociate evenimentului windowActivated . Pentru aceasta se va selecta cu butonul drept al mouse-ului un punct din fereastr n care nu exist nici un control Windows i n meniul contextual se va selecta Events / Window / windowActivated.

37

n cazul formularului spitale, metoda spitaleWindowActivated() astfel adugat va iniializa succesiv variabilele comanda (Statement) i rez (ResultSet) i va plasa n controlul numespit numele primului spital. private void SpitaleWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { comanda = cnx.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); rez = comanda.executeQuery("SELECT * FROM spitale"); if (rez.next()) { String nm = rez.getString("nume"); numespit.setText(nm); } } catch (SQLException sqlException) { System.out.println("Conectare imposibila."); System.exit(1); } } Practic s-a adugat doar codul evideniat, adugarea instruciunii try-catch realizndu-se de mediul de programare, ca n exemplele precedente. La nchiderea ferestrei este necesar apelarea metodelor close() pentru obiectele rez i comanda. Pentru a aduga aplicaiei o metod care se apeleaz la nchiderea formularului spitale se procedeaz ca mai sus, evenimentul selectat fiind windowDeactivated.

private void SpitaleWindowDeactivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { rez.close(); comanda.close();
38

} catch (SQLException ex) { ex.printStackTrace(); } } Pentru a iniia introducerea secvenei de cod care trebuie executat la acionarea unui buton se modific proprietatea actionPerformed sau, mai simplu, se selecteaz controlul cu un dublu clic. Mediul de dezvoltare va include automat o funcie de tratare a evenimentului al crui coninut trebuie apoi editat.

private void spiturmActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { if (!rez.isLast()) // nu este pe ultima linie { spitprec.setEnabled(true); if (rez.next()) // Trec pe urmatoarea linie { // preiau numele String nm = rez.getString("nume"); numespit.setText(nm); } } else { spiturm.setEnabled(false); } } catch (SQLException esq) { } } La fel se iniiaz scrierea codului pentru celelalte dou butoane, spitprec i ies: private void spiturmActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { if (!rez.isLast()) // nu este pe ultima linie { spitprec.setEnabled(true); if (rez.next()) // Trec pe urmatoarea linie { // preiau numele String nm = rez.getString("nume");
39

numespit.setText(nm); } } else { spiturm.setEnabled(false); } } catch (SQLException esq) { } } private void iesActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Spitale.setVisible(false); Metoda setVisible(false) realizeaz ascunderea ferestrei de dialog. Pentru a realiza afiarea ferestrei de dialog create se revine la fereastra principal (dublu clic pe JFrame n fereastra Inspector) i se adug meniului Formulare o prim opiune, Spitale. n continuare se modific proprietatea text a noii opiuni n Spitale. Se creaz metoda care trebuie executat la selectarea noii opiuni. Pentru aceasta se selecteaz opiunea cu butonul drept al mouse-ului i n meniul contextual afiat se selecteaz Events / Action / Action Performed. Coninutul metodei pspitaleActionPerformed() este urmtorul: private void pspitaleActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Spitale.setLocation(120, 170); Spitale.setVisible(true); Spitale.pack(); Codul cuprinde o linie care impune poziia noii ferestre spitale.setLocation()), determin afiarea ferestrei (spitale.setVisible(true)) i impune reconstruirea interfeei coninute (spitale.pack()) n acord cu managerul de dispunere a obiectelor grafice (eng. layout manager). n continuare se poate executa aplicaia.

40

Se creaz un formular pentru adugarea cititorilor n baza de date, astfel: Crearea n baza de date sanatate, un nou tabel, judet, cu 3 cmpuri, cod_jud (number(2,0)), judet (varchar2(50)) i acronim (char(2) i introducerea ctorva judee.

Se adug proiectului sanatate o alt intrare n submeniul Formulare/ Adugare Pacienti. (JMenuItem).

Se adug intrrii apacienti ( = adugare pacienti) evenimentului actionPerformed codul: APacient.setLocation(120, 170); APacient.setVisible(true); APacient.pack(); Se adug clasei principale dou noi obiecte, unul adpacrez, din clasa Statement ( iniializat la deschiderea formularului i nchis la ieirea din acesta), i un al doilea, interogare1, din clasa ResultSet (acesta va conine comenzi SQL individuale care vor fi apoi trimise serverului Oracle XE ). Se ataeaz evenimentului windowActivated ( n fereastra Inspector : Form Sanatate -> Other Components -> APacienti) metoda APacientWindowActivated care va conine: - iniializarea celor dou obiecte (adpacrez i interogare1);
41

- popularea cu date a listei controlului jud de tip combobox; try { adpacrez = cnx.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); interogare1 = adpacrez.executeQuery("SELECT * FROM judet order by judet"); jud.removeAllItems(); while (interogare1.next()) { String nm = interogare1.getString("judet"); jud.addItem(nm); } } catch (SQLException ex) { ex.printStackTrace(); System.exit(1); } } Se ataeaz evenimentului windowDeactivated metoda APacientWindowDeactivated try { adpacrez.close(); interogare1.close(); } catch (SQLException ex) { ex.printStackTrace(); } } codul necesar prelurii coninuturilor din controale i apoi scrierii n baza de date este : try { String cenepe, nume, prenume, localitatea, adresa, telefon, profesia; int jude; cenepe = cnp.getText(); nume = numpac.getText(); prenume = prenpac.getText(); localitatea = loc.getText(); int poz = jud.getSelectedIndex(); // Poz. in lista interogare1.absolute(poz + 1); // mut cursorul pe linia poz+1 jude = interogare1.getInt("cod_jud"); adresa = adr.getText(); telefon = tel.getText(); profesia = prof.getText(); String frazaSQL = "INSERT into pacienti VALUES (autopac.NEXTVAL"; frazaSQL += "," + apostrof(cenepe); frazaSQL += "," + apostrof(nume); frazaSQL += "," + apostrof(prenume); frazaSQL += "," + apostrof(localitatea); frazaSQL += "," + jude; frazaSQL += "," + apostrof(adresa); frazaSQL += "," + apostrof(telefon); frazaSQL += "," + apostrof(profesia) + ")"; // Creez un Statement*/ Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT
42

System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); cnp.setText(""); numpac.setText(""); prenpac.setText(""); loc.setText(""); adr.setText(""); tel.setText(""); prof.setText(""); } } Se adug codul necesar nchiderii formularului APacienti APacient.setVisible(false); Se ruleaz aplicatia

Crearea unui formular pentru vizualizarea bolilor existente ntr-o sectie, astfel:

Se adug proiectului sanatate o alt intrare n meniul Formulare, Situatii de tip JMenu, cu o intrare de tip JMenuItem, Boli i secii.
43

Se adug pentru intrarea bolisec ( = bolile dintr-o secie) metoda de tratare a evenimentului actionPerformed care va conine codul: Bolisec.setLocation(120, 170); Bolisec.setVisible(true); Bolisec.pack(); Se adug clasei principale dou variabile globale, sectii_comanda i sectii_rs de tip Statement respectiv ResultSet. Aceste dou variabile vor fi folosite pentru a popula controlul sectiaa (JcomboBox): private Statement sectii_comanda; private ResultSet sectii_rs; Se adug clasei principale nc o variabil, dateTabel din clasa ArrayList. Aceast variabil va conine informaiile din liniile tabelului bolsec. private ArrayList dateTabel; Se populeaz controlul JComboBox cu seciile din baza de date: try { sectii_comanda= cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sectii_rs= sectii_comanda.executeQuery("SELECT * from sectii"); sectiaa.removeAllItems(); while (sectii_rs.next()) { String n = sectii_rs.getString("nume"); aut.addItem(n); } // Preiau codul primei sectii din lista sectii_rs.first(); int codse = sectii_rs.getInt("cod_sectia"); } catch (SQLException ex) { Logger.getLogger(sanatate.class.getName()).log(Level.SEVERE, null, ex); } Se preiau numele seciilor al cror cod este n codse i se adug n dateTabel: boala_stmt = null; rs = null; boala_stmt = cnx.createStatement(); rs = boala_stmt.executeQuery("SELECT boli.nume, sectii.nr_paturi FROM sectii, boli, bolsec WHERE boli.cod_boala = bolsec.cod_boala and sectii.cod_sectia = bolsec.cod_sectia and boli.cod_boala = " + String.valueOf(codse)); dateTabel = new ArrayList(); // Copiez liniile din rs in dateTabel while (rs.next()) { ArrayList linie = new ArrayList(); String boli = rs.getString("nume"); int nr_paturi = rs.getInt("nr_paturi"); linie.add(boli);
44

linie.add(nr_paturi); dateTabel.add(linie); } boala_stmt.close(); Se creaz obiectul necesar pstrrii datelor controlului bolisec (JTable). Pentru aceasta se construiete o clas abstract derivat din AbstractTableModel: secboli.setModel(new AbstractTableModel() { private String[] colNume = {"Boli", "Nr. paturi"}; public int getRowCount() { return dateTabel.size(); } public int getColumnCount() { return colNume.length; } public Object getValueAt(int linie, int col) { // Preiau linia rowIndex ArrayList rand_cautat = (ArrayList) dateTabel.get(linie); return rand_cautat.get(col); } @Override public String getColumnName(int column) { return colNume[column]; } }); // Redimensionez prima coloana TableColumn column = null; column = secboli.getColumnModel().getColumn(0); column.setPreferredWidth(300); la nchiderea formularului trebuie apelat metoda close pentru obiectul de tip Statement folosit: private void BolisecWindowDeactivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { sectii_comanda.close(); } catch (SQLException ex) { ex.printStackTrace(); } } Se ataeaz o metod de tratare a evenimentului produs la selectarea unui nou autor n controlul sectiaa (JComboBox) . n aceast metod se va prelua codul autorului selectat de utilizator i se va repopula controlul secboli (JTable). private void sectiaaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: // Se selecteaza codul bolii int linia = sectiaa.getSelectedIndex(); if (linia >= 0) { try { sectii_rs.absolute(linia + 1); int codse = sectii_rs.getInt("Cod_sectia"); // Repopulez tabelul . . .
45

boala_stmt = null; rs = null; boala_stmt = cnx.createStatement(); rs = boala_stmt.executeQuery("SELECT boli.nume, sectii.nr_paturi FROM sectii, boli, bolsec WHERE sectii.cod_sectia = bolsec.cod_sectia and boli.cod_boala = bolsec.cod_boala and sectii.cod_sectia = "+String.valueOf(codse)); dateTabel = new ArrayList(); // Copiez liniile din rs in dateTabel while (rs.next()) { ArrayList linie = new ArrayList(); String secti = rs.getString("nume"); int nr_paturi = rs.getInt("nr_paturi"); linie.add(secti); linie.add(nr_paturi); dateTabel.add(linie); } boala_stmt.close(); secboli.setModel(new AbstractTableModel() { private String[] colNume = {"Boli", "Nr. paturi"}; public int getRowCount() { return dateTabel.size(); } public int getColumnCount() { return colNume.length; } public Object getValueAt(int linie, int col) { // Preiau linia rowIndex ArrayList rand_cautat = (ArrayList) dateTabel.get(linie); return rand_cautat.get(col); } @Override public String getColumnName(int column) { return colNume[column]; } }); // Redimensionez prima coloana TableColumn column = null; column = secboli.getColumnModel().getColumn(0); column.setPreferredWidth(300); } catch (SQLException ex) { Logger.getLogger(sanatate.class.getName()).log(Level.SEVERE, null, ex); } } } Metoda executat la apsarea butonului "Iesire" private void ies3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Bolisec.setVisible(false); Rulare

46

Crearea unui formular pentru parcurgerea spitalelor din baza de date, astfel:

Se adug clasei principale dou noi obiecte, unul din clasa Statement, nume_spital si cellalt din clasa ResultSet, interogare_spitale. private Statement nume_spital ; private ResultSet interogare_spitale ; Se adug n evenimentul windowActivated try { nume_spital = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); interogare_spitale = nume_spital.executeQuery("SELECT * FROM spitale order by nume"); nume_spit.removeAllItems(); while (interogare_spitale.next()) { String nm = interogare_spitale.getString("nume"); nume_spit.addItem(nm);
47

} } catch (SQLException ex) { ex.printStackTrace(); System.exit(1); } Se adug n evenimentul ActionPerformed ataat controlului JComboBox: try { // Se selecteaza codul spitalului int linia = nume_spit.getSelectedIndex();//caut linia spitalului selectat if (linia >= 0) { interogare_spitale.absolute(linia + 1); // mut cursorul in interogare-spital pe linie codspit = interogare_spitale.getInt("cod_spital"); //preiau spitalul selectat intr-o variabila //populez textboxurile try { comanda = cnx.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); rez = comanda.executeQuery("SELECT adresa, telefon FROM spitale WHERE cod_spital ="+codspit); if (rez.next()) { String sir1 = rez.getString("adresa"); String sir2 = rez.getString("telefon"); adresa_spit.setText(sir1); telefon_spit.setText(sir2); } } catch (SQLException ex) { ex.printStackTrace(); } } } catch (SQLException ex) { ex.printStackTrace(); }

Crearea unui formular pentru adaugarea unei noi secii


Se adug proiectului sanatate o alt intrare n submeniul Adaugare, Sectie de tip JMenuItem:

48

Se creaz un formular pentru introducerea seciilor noi n baza de date, astfel:

Se adug intrrii asectie ( = adaugare secii) evenimentului actionPerformed codul: ASectie.setLocation(120, 170); ASectie.setVisible(true); ASectie.pack(); Se declar 4 variabile globale , dou de tip Statement i dou de tip ResultSet: private Statement diagnostice; private ResultSet rezultat_diagnostice; private Statement spitalele; private ResultSet rezultat_spitalele; la deschiderea formularului trebuie rulat codul pentru popularea celor dou controale de tip JComboBox, unul pentru lista diagnosticelor i cellalt pentru lista spitalelor din baza de date:
private void ASectieWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { //populez lista diagnosticelor diagnostice= cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_diagnostice = diagnostice.executeQuery("SELECT * from boli order by nume"); diagnostic.removeAllItems(); while (rezultat_diagnostice.next()) { String n = rezultat_diagnostice.getString("nume"); diagnostic.addItem(n); 49

} //populez lista spitalelor spitalele = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_spitalele = spitalele.executeQuery("SELECT * from spitale"); spital.removeAllItems(); while (rezultat_spitalele.next()) { String n = rezultat_spitalele.getString("nume"); spital.addItem(n); } } catch (SQLException ex) { ex.printStackTrace(); } }

la nchiderea formularului se ruleaz

private void ASectieWindowDeactivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { diagnostice.close(); spitalele.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

Se declar dou variabile globale, codboli i codspit pentru preluarea codurilor bolii i spitalului selectate; Se preia din controlul de tip JComboBox diagnostic, codul autorului selectat de utilizator, astfel:
try { // Se selecteaza codul bolii int linie = diagnostic.getSelectedIndex(); if (linie >= 0) { rezultat_diagnostice.absolute(linie + 1); codboli = rezultat_diagnostice.getInt("Cod_boala"); } } catch (SQLException ex) { ex.printStackTrace(); }

Se preia din controlul de tip JComboBox cu numele spital, codul editurii selectate de utilizator, astfel:
try { // Se selecteaza codul editurii int linie = spital.getSelectedIndex(); if (linie >= 0) { rezultat_spitalele.absolute(linie + 1); codspit = rezultat_spitalele.getInt("cod_spital"); } } catch (SQLException ex) { ex.printStackTrace(); }

la apsarea butonului "Iesire": ASectie.setVisible(false); la apsarea butonului "Adaugare":


try { 50

String num, nr; num = numele.getText(); nr = paturi.getText(); String frazaSQL = "INSERT into sectii VALUES (autosec.NEXTVAL"; frazaSQL += "," + apostrof(num) + "," + codspit + "," + apostrof(nr) + ")"; // Creez un Statement*/ Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); //preiau codul sectiei introduse int c; s = cnx.createStatement(); r = s.executeQuery("SELECT autosec.CURRVAL as c from dual"); r.next(); c = r.getInt("c"); //adaug sectia si in bolsec String fraza1SQL = "INSERT into bolsec VALUES (" + codboli + "," + c + ")"; System.out.println(fraza1SQL); stm.executeUpdate(fraza1SQL); stm.close(); //golesc campurile numele.setText(""); paturi.setText(""); } catch (SQLException ex) { ex.printStackTrace(); }

la apsarea butonului "Alt diagnostic": ABoli.setLocation(120, 170); ABoli.setVisible(true); ABoli.pack();

la apsarea butonului "Alt spital": ASpital.setLocation(120, 170); ASpital.setVisible(true); ASpital.pack();

Crearea unui formular pentru inregistrarea internrilor


Se adug proiectului sanatate o alt intrare n submeniul Operatii, Miscare pacienti de tip JMenuItem:

51

Se creaz un formular pentru introducerea datelor pacientilor internati n baza de date, astfel:

Se adug intrrii miscarepac ( = adaugare secii) evenimentului actionPerformed codul: MPacienti.setLocation(120, 170); MPacienti.setVisible(true); MPacienti.pack(); la deschiderea formularului trebuie rulat codul pentru popularea celor patru controale de tip JComboBox, pentru lista pacientilor, pentru lista diagnosticelor, pentru lista sectiilor si pentru cea a spitalelor din baza de date: private void MPacientiWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { //populez lista pacientilor pacientii = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_pacientii = pacientii.executeQuery("SELECT * from pacienti order by nume");
52

numepacient.removeAllItems(); while (rezultat_pacientii.next()) { String n = rezultat_pacientii.getString("nume")+ rezultat_pacientii.getString("prenume"); numepacient.addItem(n); } //populez lista sectiei sectiile = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_sectiile = sectiile.executeQuery("SELECT * from sectii order by nume"); sectia.removeAllItems(); while (rezultat_sectiile.next()) { String n = rezultat_sectiile.getString("nume"); sectia.addItem(n); } //populez lista diagnosticului diagnostice = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_diagnostice = diagnostice.executeQuery("SELECT * from boli order by nume"); diagnosticul.removeAllItems(); while (rezultat_diagnostice.next()) { String n = rezultat_diagnostice.getString("nume"); diagnosticul.addItem(n); } //populez lista spitalelor spitalele = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat_spitalele = spitalele.executeQuery("SELECT * from spitale order by nume"); spitalul.removeAllItems(); while (rezultat_spitalele.next()) { String n = rezultat_spitalele.getString("nume"); spitalul.addItem(n); } } catch (SQLException ex) { ex.printStackTrace(); } la apsarea butonului "Inregistrare": private void inregistrActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { String dataint, dataext; int paci, dgn, sect, spi; dataint = dataintern.getText(); //System.out.println(dataint); dataext = dataextern.getText(); int poz = numepacient.getSelectedIndex(); int poz1 = diagnosticul.getSelectedIndex(); int poz2 = sectia.getSelectedIndex(); int poz3 = spitalul.getSelectedIndex();
53

rezultat_pacientii.absolute(poz + 1); // mut cursorul pe linia poz+1 paci = rezultat_pacientii.getInt("cod_pac"); // System.out.println(paci); rezultat_diagnostice.absolute(poz1 + 1); // mut cursorul pe linia poz1+1 dgn = rezultat_diagnostice.getInt("cod_boala"); rezultat_sectiile.absolute(poz2 + 1); // mut cursorul pe linia poz2+1 sect = rezultat_sectiile.getInt("cod_sectia"); rezultat_spitalele.absolute(poz3 + 1); // mut cursorul pe linia poz3+1 spi = rezultat_spitalele.getInt("cod_spital"); String frazaSQL = "INSERT into internari VALUES (" + paci + "," + sect + "," + dgn + "," + spi + "," + apostrof(dataint) + "," + apostrof(dataext) + ")"; // Creez un Statement*/ Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); dataintern.setText(""); dataextern.setText(""); } la apsarea butonului "Iesire": MPacienti.setVisible(false);

Crearea de rapoarte
Raport simplu

54

la apsarea butonului "Vezi": private void VizualizareActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: String raport = "./rapoarte/spitale.jrxml"; // Fisier realizat de iReports HashMap params = new HashMap(); try { JasperReport jasperReport = JasperCompileManager.compileReport(raport); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, cnx); JasperViewer.viewReport(jasperPrint, false); }catch (JRException ex) { ex.printStackTrace(); } la apsarea butonului "Out":
private void IesireActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: ListaSpit.setVisible(false);

Raport cu grad de dificultate mai ridicat

55

la deschiderea formularului trebuie rulat codul pentru popularea controlului de tip JComboBox :
private void ListaPacWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { jud_comanda = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); jud_rs = jud_comanda.executeQuery("SELECT * from judet order by judet"); judet.removeAllItems(); while (jud_rs.next()) { String n = jud_rs.getString("judet"); judet.addItem(n); } } catch (SQLException ex) { ex.printStackTrace(); }

Se preia din controlul de tip JComboBox cu numele judet, codul judetului selectat de utilizator, astfel: private void judetActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { // Se selecteaza codul judetului int linie = judet.getSelectedIndex();
56

if(linie >= 0) { jud_rs.absolute(linie + 1); codjud = jud_rs.getInt("cod_jud");// codjud este variabil de tip int, a clasei numejud = jud_rs.getString("judet"); //numejud este variabil de tip String, a clasei System.out.println(codjud); } } catch (SQLException ex) { ex.printStackTrace(); } la apsarea butonului "Vizualizare": private void vizActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: String raport = "./rapoarte/pacientiipejud.jrxml"; // Fisier realizat de iReports HashMap params = new HashMap(); // se definesc valoarea parametrului din raport, codjud // System.out.println("Codjud="+codjud); params.put("codjud", codjud); params.put("numejud", numejud); // Se poate face raportul try { JasperReport jasperReport = JasperCompileManager.compileReport(raport); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, cnx); JasperViewer.viewReport(jasperPrint, false); }catch (JRException ex) { ex.printStackTrace(); } la apsarea butonului "Iesire": ListaPac.setVisible(false);

Relaii ntre tabelele din baza de date

57

58

BIBLIOGRAFIE 1. [CONN00] T.Connolly Database Systems, ed.Mc Graw Hill, 2000. 2. [DATE94] J.Date An introduction to Database Systems, ed. Addison Wesley, 1994 3. [FOTA01] M. Fotache SQL. Dialecte DB2, Oracle, Visual FoxPro, ed. Polirom, 2001 4. [LUBO95] I. Lungu, C. Bodea . a. - Baze de date organizare, proiectare i implementare , ed. ALL, 1995. 5. [LUIA05] I. Lungu, I. Iacob Aplicaii informatice utiliznd SGBD Oracle, ed. ProUniversalis, 2005 6. [LUIO02] I. Lungu, M. Iorga, M Velicanu Baze de date. S nvm sistemul Oracle n 28 de lecii., ed. Economic, 2002 7. [LURO93] I.Lungu, I. Roca, N. Muat, Gh. Sabu Baze de date relaionale. Utilizarea limbajului SQL*PLUS, ed. ALL, 1993 8. [LUVE00] M.Velicanu, I.Lungu, M.Muntean Teste i probleme de programare n Visual Foxpro i Oracle, ed.Petrion, 2000. 9. [VELU00] M.Velicanu, I.Lungu .a. Sisteme de gestiune a bazelor de date, ed.Petrion, 2000. 10. [VELU01] M.Velicanu, I.Lungu, M.Muntean Dezvoltarea aplicaiilor cu baze de date n Visual Foxpro, ed. ALL, 2001 11. [VELU02] M.Velicanu, I.Lungu, M.Muntean, M.Iorga, S.Ionescu Oracle platform pentru baze de date, ed. Petrion, 2002. 12. [VELU03] M.Velicanu, I.Lungu, M.Muntean, S. Ionescu Sisteme de baze de date, ed.Petrion, 2003. 13. www.oracle.com 14. www.oracle-base.com

59

CUPRINS
CAPITOLUL 1. TEORIA BAZELOR DE DATE RELAIONALE2 MODELUL RELAIONAL....2 BAZE DE DATE RELAIONALE....3 EXEMPLE DE SISTEME DE GESTIUNE A BAZELOR DE DATE RELAIONALE.....4 CAPITOLUL 2. FACILITILE I ARHITECTURA SISTEMULUI ORACLE....5 EVOLUIA I FACILITILE SISTEMULUI ORACLE.......5 ARHITECTURA SISTEMULUI ORACLE...6 ORACLE SERVER...6 CAPITOLUL 3. ELEMENTELE DE BAZ ALE LIMBAJULUI SQL.8 INTRODUCEREA COMENZILOR SQL FOLOSIND INTERFAA GRAFIC..8 TIPURI DE DATE SUPORTATE DE ORACLE....10 CREAREA TABELELOR N ORACLE XE..11 CAPITOLUL 4. ORACLE JDBC...19 GENERALITI19 PRINCIPALELE CLASE DIN JDBC...19 CAPITOLUL 5.REALIZAREA INTERFEEI APLICAIEI - PARTEA PRACTIC...23 BIBLIOGRAFIE .............................................................................................................................................................59

60

S-ar putea să vă placă și