Documente Academic
Documente Profesional
Documente Cultură
Calendar activitate:
15.02 – 09.05.2010 - ACTIVITATE DIDACTICA (12 sapt.);
10.05 – 23.05.2010 - Definitivare lucrare licenta (2 sapt.);
24.05 – 20.06.2010 - Sesiune de examene (4 saptamani);
21.06 -04.06.2010 - RESTANTE (2 sapt.);
21.06 – 05.06.2010 - Inscriere la lienta ;
7.07 - 11.07.2010 - EXAMEN DE LICENTA
Obiecte din schema bazei de date. Extensii procedurale ale SQL. Dicţionarul bazei de
date. Reguli de validare. Tabele virtuale în ORACLE si VFP.
Bibliografie:
1. BAZE DE DATE – ORACLE – SQL, SQL*Plus, PL/SQL
Autori : Prof. Dr. Virgil Chichernea, Lector drd. Gabriel Garais, Asistent univ. Dragos
Paul Pop, Editura Universitatii Romano-Americane, Bucuresti 2009.
Lect. univ. drd. Gabriel Eugen Garais Asist. univ. Dragos Paul Pop
BAZE DE DATE
ORACLE
- SQL, SQL*Plus, PL/SQL -
Bucuresti 2009
Cuprins
Prefaţă
BAZE DE DATE RELATIONALE SI ARHITECTURA
FUNCTIONALA A SGBD ORACLE
1.1. Baze de date relaţionale (BDR)
1.2. Modelul relaţional
1.3. Forme normale
1.4. Arhitectura funcţională a SGBD ORACLE
PARTEA I
Sectiunea I:
LIMBAJUL SQL (Structured Query Language) - ORACLE
2.1. Prezentarea limbajului SQL-ORACE
- Tabele
- Structura comenzilor în SQL
2.2. Limbajul de definire a datelor (LDD)
a) Crearea bazei de date şi spaţiului alocat tabelelor
Crearea bazei de date în SQL : Comanda CREATE DATABASE
Crearea spaţiului alocat tabelelor
b) Crearea obiectelor în baza de date
Crearea unei tabele
Modificarea structurii într-o tabela existentă:
c) Crearea viziunilor : Comanda CREATE VIEW
d) Vizualizarea structurii unei tabele
e) Ştergerea unui obiect din baza de date
2.3. Limbajul de manipulare a datelor
Comanda INSERT
Comanda DELETE
Comanda UPDATE
Comanda SELECT
2.4. Limbajul pentru controlul accesului la date (LCD)
2.5. Interogarea bazelor de date. Implementarea operatorilor relaţionali
Interogări simple
2.5.1 Implementarea operatorilor de selecţie şi proiecţie
2.5.2. Expresii, condiţii şi operatori
Operatori:
a) Operatori aritmetici
b) Operatori de comparaţie:
c) Operatori de subliniere
d) Operatori logici: AND; OR; NOT;
e) Operatori pentru mulţimi: UNION şi UNION ALL
f) Operatorul INTERSECT
g) Operatorul MINUS
h) Operatorul BETWEEN
i) Operatorul LIKE
j) Operatorul IN
2.5.3. Implementarea operatorului JOIN (operator de compunere)
a) Echi-joncţiunea ( jonctiunea echivalentă)
b) Non – echi- joncţiuni
c) Joncţiuni externe
d) Auto-joncţiunea (joncţiunea tabelei cu ea însăsi)
2.5.4. Crearea de scripturi (Macro)
2.5.5. Definirea variabilelor în SQL
Sectiunea a II-a:
SQL*PLUS (Manual de utilizare).
3.1. Sesiunea de lucru
3.2. Moduri de lucru cu SQL*Plus
3.3. Editarea comenzilor SQL*Plus (exemple)
3.4. Opţiunile de lucru. Comanda SET;
3.5. Utilizarea variabilelor utilizator
3.6. Introducerea de comentarii printre comenzile dintr-un fişier
3.7. Afişarea unor informaţii: (DESCRIBE: HELP{COMANDS/ CLAUSE})
3.8. Parametrizarea/abandonarea schimbărilor asupra BD
3.9. Controlul accesului la baza de date: nume utilizator şi parola.
3.10. Formatarea rezultatelor şi editarea de rapoarte
3.11. Dicţionarul datelor – componenta a SGBD ORACLE
PARTEA a II-a:
LIMBAJUL DE PROGRAMARE PL/SQL
Sectiunea I:
4.1. Introducere în limbajul PL/SQL
4.2. Structura unui bloc de bază PL/SQL
4.3. Declararea variabilelor
4.4. Elemente de limbaj
4.1.3 Declaraţiile
4.5. Instrucţiuni PL/SQL
4.6. Gestiunea cursorului în PL/SQL
4.7. Subprograme PL/SQL
4.8. Pachete
4.9. Declanşatori (triggeri)
- 4.9.1. Integritatea restricţiilor şi triggeri
- 4.9.2. Integritatea restricţiilor
- 4.9.3. Exemple de triggeri
- 4.9.4. Programarea trigerilor
- 4.9.5. Mai multe despre trigeri
4.10. Gestiunea erorilor
4.11. Abordarea orientată obiect în PL/SQL
- 4.11.1. Programarea în PL/SQL
- 4.11.2. Încorporarea SQL şi Pro*C
- 4.11.3. Concepte generale
- 4.11.4. Variabile gazda şi variabile de comunicaţii
- 4.11.5. Zona de comunicare
Sectiunea a II-a:
PROBLEME REZOLVATE ÎN SQL ŞI PL/SQL
5.1. Prezentarea studiului de caz şi a modelului relaţional
5.2. Probleme referitoare la LDD şi LMD
5.3. Interogări monorelaţie
5.4. Interogări utilizând operatorii relaţionali
5.5. Interogări multi relaţie
5.6. Aplicaţii referitoare la vizualizări
5.7. Aplicaţii referitoare la declanşatori
5.8. Subprograme în PL/SQL
PARTEA a III-a:
Sectiunea I: Proiecte realizate in SQL si PL/SQL
Sectiunea a II-a:
PREZENTAREA ŞI UTILIZAREA APLICAŢIEI SITI-
RATING
6.1 Obiective
6.2 Modele economico-matematice utilizate
6.3 Manual de utilizare
Sectiunea a III-a:
Pliant SQL
Teste de autoevaluare
Bibliografie
EXTRAS DIN CUPRINSUL CURSURILOR PREDATE LA :
DISCIPLINA : BD-ORACLE AN III – SERIA A
Prof. Dr. Virgil Chichernea
ARHITECTURA ORACLE
INTERFETE DE DEZVOLTARE
NUCLEUL ORACLE
INSTRUMENTE DE INTRETINERE
BROWSERE, EDITOARE, …
Fig. 5. Arhitectura funcţională ORACLE
Oracle DBMS server se bazează pe aşa numita arhitectură Multi-Server. Serverul este
responsabil cu procesarea tuturor bazelor de date active, adică cu execuţia unei comenzi
SQL, managementul userului, resurselor şi memoriei. Deşi există numai o copie a codului
de program pentru SGBD server, fiecare utilizator este conectat la un server logic care îi
este destinat. Fig. Nr.6 ilustrează arhitectura SGBD Oracle privind structura memoriei,
proceselor şi fişierelor.
Utilizator 1 Utilizator 2 Utilizator n
Fişiere Fişiere
Fişiere Fişiere
Control Arhivă şi backup
date Redo-log
Baza de date a unei aplicaţii realizată în ORACLE conţine tabele corelate în care se
memorează datele aplicaţiei. Rândurile unei tabele reprezintă Entităţi (înregistrări), iar
coloanele tabelei reprezintă atribute (câmpuri). Un model de date este o structură pentru
descrierea şi documentarea datelor necesare utilizatorului care pot fi implementate într-o
bază de date. Un model de date trebuie să fie creat pentru fiecare user. Toate modelele de
useri sunt adunate într-un model de bază de date. Un view de user este dezvoltat din
modelul de bază de date pentru a reprezenta modelul fiecărui user.
Schema bazei de date descrie în totalitate baza de date adică: descrie tabelele, defineşte
relaţiile, defineşte domeniile, defineşte regulile afacerilor.
În arhitectura bazei de date se face distincţie între structura logică şi fizică a bazei de date
(vezi fig. nr. 9). Structura logică descrie zonele logice de memorie (numite spaţii) unde
obiectele ca tabelele pot fi memorate. Structura fizică este determinată de fişierele
sistemului de operare care constituie baza de date.
Baza de date
LOGIC FIZIC
Segment
Extensie
Tabele
Segment
Tabele
Tabele
Block extent
1.2
SQL*PLUS (Manual de utilizare).
2.1. Sesiunea de lucru
2.2. Moduri de lucru cu SQL*Plus
2.3. Editarea comenzilor SQL*Plus (exemple)
2.4. Opţiunile de lucru. Comanda SET;
2.5. Utilizarea variabilelor utilizator
2.6. Introducerea de comentarii printre comenzile dintr-un fişier
2.7. Afişarea unor informaţii: (DESCRIBE: HELP{COMANDS/ CLAUSE})
2.8. Parametrizarea/abandonarea schimbărilor asupra BD
2.9. Controlul accesului la baza de date: nume utilizator şi parola.
2.10. Formatarea rezultatelor şi editarea de rapoarte
2.11. Dicţionarul datelor – componenta a SGBD ORACLE
SQL*PLUS - PREZENTARE GENERALA
Obiective:
- Prezentarea unui manual minimal de utilizare a interfeței SQL*Plus;
- Controlul accesului la baza de date: nume utilizator şi parola;
- Formatarea rezultatelor şi editarea de rapoarte;
- Accesul la dicționarul datelor ORACLE.
Cele mai recente instrucţiuni SQL sunt memorate în bufferul SQL, indiferent dacă aceste
instrucţiuni au sau nu sintaxa corectă. Se poate edita bufferul folosind una din comenzile:
• l[ist] – listează toate liniile din bufferul SQL şi marchează cu “_” linia curentă din
buffer
• l<number> - listază linia <number>
• c[hange]/<old string>/<new string> - inlocuiește secvența șirului vechi cu șirul nou;
• a[ppend]<string> - adauga <string> la linia curentă;
• del – șterge linia curentă;
• r[un] – execută conţinutul bufferului;
• get<file> - citește datele din fişierul <file> în buffer;
• save<file> - scrie bufferul current în <file>;
•edit invocă (lansează) editorul şi incarcă bufferul curent în editor. După iesirea din editor
instrucțiunea SQL modificată este memorată în buffer şi poate fi executată cu comanda r;
Editorul poate fi definit în shell-ul SQL*Plus prin tastarea comenzii:
editor =<name>, unde <name> poate fi un nume de editor.
Comenzile SQL sunt memorate în buffer-ul comenzilor SQL şi pot fi modificate fără
a fi nevoie de retastare. Editarea se poate realiza utilizând următoarele comenzi
SQL:
L afişează toată comanda (toate liniile comenzii din buffer-ul SQL);
Ln afişează numai linia n;
L* afişează linia curent[;
Lmn afişează liniile de la m la n;
Llast afişează linia precedentă;
I inserarea de linii după linia curentă.
6) Să se indice efectuarea unui salt de trei rânduri la începutul unei pagini noi.
SQL> /
old 1: selected &VAR1, &VAR2
new 1: SELECTED MARCA, NUME
MARCA NUME
----------------------------
400 GICA ION
Obs. Pentru ca după afişarea unei pagini să se facă pauză, urmând să se aştepte apăsarea
tastei ENTER , se foloseşte comanda PAUSE [text].
SQL> COMMIT
commit complete
SQL> ROLLBACK
rolback complete
Raportul este o formă de afişare a datelor într-un format cerut de beneficiar. Pentru
realizarea editării de rapoarte profesionale SGBD ORACLE pune la dispoziţia
utilizatorilor un număr de comenzi aşa cum se poate vedea în cele ce urmează:
Dicţionarul datelor Oracle este cea mai importantă componentă a SGBD-ului Oracle. El
conţine toate informaţiile despre structura şi obiectele bazei de date cum ar fi tabelele,
coloanele, utilizatorii, fişierele de date etc. Datele memorate în dicţionarul datelor se
numesc metadate. Deşi el constituie domeniul administratorul bazei de date, datele
dicţionarului sunt surse de informaţii pentru utilizatori şi pentru dezvoltatorii de aplicaţii.
Dicţionarul datelor conţine două nivele : nivelul intern care conţine toate tabelele de bază
care sunt utilizate de către componentele software SGBD si ele nu sunt accesibile
utilizatorilor finali.
Nivelul extern furnizează numeroaselor vederi informaţiile accesate de către aceste tabele
despre obiectele şi structurile la diferite nivele în detaliu.
Comanda SQL
select * from DICT[IONARY];
8. Cereri complexe
9. Realizare rapoarte şi videoformate(Forms) în SQL
Obiective:
- Prezentarea şi modul de lucru cu limbajului SQL;
- Interogarea bazelor de date şi implementarea operatorilor relaţionali:
- Funcţii SQL şi funcţii agregate SQL;
- Cereri complexe care au ca suport mai multe tabele ;
- Realizare rapoarte şi videoformate(Forms) în SQL.
Limbajul SQL (Structured Query Language) este un limbaj standard care poate fi
utilizat pentru a defini, interoga, actualiza, şi gestiona o bază de date relaţională.
SQL utilizează următorii termeni: tabelă, linii, coloane, sau termeni echivalenţi, relaţii,
înregistrării/tupluri, atribute. În acest manual se va folosi: linii/randuri/înregistrări/tupluri
şi coloane/atribute.
O tabelă poate avea maxim 254 coloane care pot avea acelaşi tip de date sau tipuri
diferite de date şi în care se pot memora domenii de valori. Domeniile posibile sunt: date
alfanumerice (şiruri), numere şi date formatate.
SGBD ORACLE oferă următoarele tipuri de date:
- char (n): date tip caracter în lungime fixă (şir), de lungime n caractere.
Mărimea maximă pentru n este 255 bytes. Spaţiul fizic ocupat este egal cu n.
Dacă lungimea reală a şirului este mai mică decât lungimea declarată atunci
se completează automat şirul cu spaţii în partea dreaptă pană la completarea
celor n caractere declarate.
Definirea tabelelor
Tabela este acea structură a bazei de date în care se memorează datele bazei de date
relaţionale. Definirea tabelelor include operaţiile de creare de tabele noi (comanda
CREATE), vizualizarea structurii tabelei (comanda DESCRIBE), modificarea structurii
tabelelor existente (comanda ALTER), şi ştergerea la cererea utilizatorilor a tabelelor
(comanda DROP).
Crearea unei tabele: Sintaxa generala a comenzii de creare a unei tabele este:
UNIQUE
Forţează unicitatea pe coloană;
NOT NULL
Nu acceptă valori null;
PRIMARY KEY
Defineşte coloana ca fiind cheie primară
REFERENCES tabela (coloana1, coloana2,...)
Defineşte coloana ca fiind o cheie străina;
ON DELETE CASCADE
Forţează ştergerea înregistrărilor când părintele cheilor străine este şters.
Poate fi folosit doar cu clauza REFERENCES;
DEFAULT
Oferă o valoare implicită pentru coloană;
CHECK conditie
Verifică condiţia înainte de a accepta data;
Comanda DESCRIBE:
Pentru a vizualiza structura unei tabele se utilizează comanda DESCRIBE, care
are ca efect listarea structurii unei tabele cu toate componentele ei (nume tabelă, nume şi
tip coloane, cheie primară, etc.) şi are sintaxa:
DESCRIBE < NUME_TABELA>;
Observaţie. Putem folosim ALTER TABLE pentru a adăuga sau renunţa la restricţiile
definite într-o tabelă. Constrângerile sunt înregistrate în dicţionarul datelor şi sunt de
forma:
nume-coloană numele unei coloane unde este aplicată restricţia;
NULL or NOT NULL activează sau anulează dreptul unei coloane de a avea valori
nule;
UNIQUE fiecare rând trebuie să aibă o valoare distinctă pentru coloană;
fiecare coloană trebuie să fie declarată NOT NULL, coloana
nu are voie să fie PRIMARY KEY
PRIMARY KEY specifică coloana ca fiind cheie primară;
FOREIGN KEY column, column... REFERENCES table column, column...
specifică coloana ca şi cheie străină a coloanei tabelei;
CHECK condition setează o condiţie, coloana trebuie să satisfacă această condiţie
pentru a exista în tabelă. Într-o coloană restricţia CHECK se
poate referi doar la coloana de care restricţia aparţine. Într-o
tabelă, clauza CHECK restricţie, se poate referi la coloane
multiple.
Restricţia FOREIGN KEY/REFERENCES:
- respinge INSERT sau UPDATE dacă nu există o valoare corespondentă în
cheia primară a tabelei;
- respinge DELETE dacă invalidează restricţiile REFERENCES;
- trebuie să facă referire la o coloană cheie primară sau unică în tabela cheii
primare;
- se va referi la cheia primară a tabelei dacă nici o coloană sau grup de coloane
nu este specifică t în restricţie;
- trebuie să facă referire la o tabelă, nu o viziune;
- nu restricţionează modul in care celelalte restricţii se pot referi la aceeaşi
tabelă;
- necesită coloana cheie primară şi coloana restricţionată să aibă aceleași tipuri
de date;
- poate referi aceeaşi tabelă numită în CREATE TABLE.
Cu ajutorul acestei comenzi se pot adăuga atribute, sau şterge atribute din structura unei
tabele. Când un atribut este adăugat, valorile pentru aceasta sunt NULL, dacă data nu este
o valoare default specificată în definirea coloanei.
Definirea vizualizărilor (Comanda CREATE VIEW...):
O vizualizare (view) este o tabelă logică relativă la datele conţinute în una sau mai
multe tabele sau vizualizări. Vizualizarea este definită pornind de la o cerere de
interogare de date şi fiind o tabelă virtuală nu solicită o alocare de memorie pentru date.
Ea este definită în dicţionarul datelor şi are caracteristicile unei tabele.
Sintaxa generală de creare a unei vizualizări este următoarea:
Comentariile pe tabele şi coloane sunt memorate în dictionarul datelor. Ele pot fi accesate
utilizând vederi din dicționarul datelor prin comenzile USER TAB COMMENTS şi
USER COL COMMENTS .
Observații:
1. Tabelele se crează fără date şi se populeaza cu date cu ajutorul comenzii
INSERT. După crearea unei tabele, putem adăuga noi coloane, partiții şi
restricţii de integritate cu ajutorul clauzeii ADD a comenzii ALTER TABLE.
Se poate schimba definirea unei coloane existente sau a unei partiții cu
ajutorul clauzei MODIFY a comenzii ALTER TABLE.
Instrucţiunea UPDATE verifică mai întâi condiţia de căutare şi pentru toate înregistrările
care verifică condiţia, valoarea corespunzătoare este actualizată.
Permite ştergerea completă a unei tabele dintr-o bază de date, inclusiv indecşi ataşaţi.
a) Selectarea coloanelor
Pentru a fi selectate coloanele dintr-o tabela ele sunt specifică te prin cheia de selecție.
Această operație se mai numește şi proiecție. De exemplu, interogarea
b) Selectarea înregistrărilor
Până acum am văzut cum se selectează atributele (coloanele) unei tabele. Pentru a selecta
numai anumite înregistrări care satisfac anumite condiții, aceste condiții se specifică prin
clauze care se referă la înregistrări. În clauzele de selecție pot apărea operatori de
comparație, operatori logici, sau chiar subinterogari şi clauze
Examplu: Să se listeze funcţia şi salariile numai salariaților pentru care codul șef proiect
(CodSP) este 7698 or 7566 şi castigă mai mult de 1500:
Semnul % precizează șirul care este căutat, chiar dacă șirul este gol.
În contrast semnul _ semnifică înlocuirea unui singur caracter. De exemplu condiția :
WHERE CodDept LIKE ‟%C_C%‟
arată că cererea se referă numai la un singur caracter care poate să apară între cei doi C.
f) Funcţii agregate
Funcţiile agregate sunt funcţiile statistice: COUNT, MIN, MAX etc. Ele pot fi utilizate
numai asupra valorilor unei coloane.
Obs: Funcţiile AVG, MIN şi MAX ignoră înregistrările care au valoare nulă, dar funcţia
COUNT le consideră (numără).
g) Grupări
În paragraful anterior am vazut cum funcţiile agregate pot fi utilizate pentru a calcula o
valoare pentru o anumită coloană. Deseori se cere gruparea înregistrărilor care au aceleași
proprietăți şi apoi să aplicăm funcţiile agregate pentru o coloană aparținând unui grup
anume.
Pentru aceasta, SQL pune la dispoziție clauza: <GROUP BY COLUMN(S)>. Această
clauză apare după clauza WHERE şi trebuie să se refere la coloanele tabelelor listate în
cluaza FROM şi are sintaxa:
Prin acest procedeu se regasesc şi se grupează acele înregistrări care au aceași valoare
pentru <grup coloane>. Agregarea specificată în clauza SELECT este aplicată separat
fiecărui grup. Este important ca numai acele coloane care apar în clauza “group
column(s)” pot fi listate fară ca funcţia de agregare în clauza SELECT.
SELECT câmp1, câmp2,, ..., câmpn FROM Fis1, Fis2,..., Fism WHERE condiţie;
În urma execuţiei acestei comenzi se obţine un rezultat sub forma unei liste afişată pe
display, sau a unei tabele, sau a unei tabele temporare. Dacă se doreşte eliminarea
înregistrărilor identice din rezultatul interogării atunci se utilizează în fraza SELECT
opţiunea DISTINCT şi comada de selecţie în acest caz devine:
SELECT DISTINC câmp1, câmp2,, ..., campn FROM Fis1, Fis2,..., Fism
WHERE condiţie;
Condiţii:
Condiţiile fac posibile interogările selective, adică permit returnarea numai a acelei
submulţimi de înregistrări care satisfac condiţia specificată. În mod frecvent condiţiile
sunt exprimate prin clauza WHERE a comenzii SELECT şi apar sub forma:
SQL> SELECT *
FROM PERSONAL
WHERE Nume=‟Stan‟; (Efect ?)
Operatori:
Operatori aritmetici: +; -; /; *; modulo(%); (returnează restul împărţirii)
Exemplu : 5%2=1 sau 6%2=0
În multe cazuri pentru a da o formă mai profesională (o formă elegantă şi eficientă) a
cererilor se utilizează conceptul de alias. Spre exemplu să urmărim folosirea în sintaxa
unei instrucţiunii a unui nume-coloană alias.
Operatori de comparaţie:
În algebra relaţiilor se pot utiliza operatorii de comparaţie. Valori obţinute prin
evaluarea acestui operator sunt: TRUE; FALSE; UNKNOWN
Operatori de subliniere:
Fie tabela : STUDENŢI (Nume, Iniţiala, Prenume, Telefon,….). Precizați
semnificațiile comenzilor:
1) SQL> SELECT * FROM STUDENŢI;
2) SQL >SELECT * FROM STUDENŢI WHERE Iniţiala LIKE „C_„;
3) SQL> SELECT * FROM STUDENŢI WHERE Telefon „555_6_6‟;
4) SQL> SELECT * FROM STUDENŢI WHERE Telefon „555_6%‟;
Această comandă are ca efect returnarea tuturor valorilor câmpului Nume dinstincte
din cele două liste, fara a elimina duplicatele.
Observatii:
1.Prin definiţie, rândurile duplicate sunt înlăturate din reuniune.
2.Dacă opţiunea ALL este. inclusă, rândurile duplicat sunt păstrate
Comanda are ca rezultat listarea liniilor comune din tabele FIS1 şi FIS2.
Exemplu: Să se listeze produsele care au o valoare în stoc mai mică de 100 şi au fost
contractate de cel puţin 8 clienţi:
SELECT CodP, DenP, FROM PRODUSE
WHERE Cant < 1000
INTERSECT
SELECT CodP, DenP, FROM CONTRACTE
GROUP BYCodP
HAVING COUNT (*) > 8;
Operatorul MINUS returnează înregistrările din prima interogare care nu fac parte
din a doua interogare.
Operatorul MINUS implementează operaţia de diferenţă din algebra relaţională. Acest
operator returnează doar rândurile ce se află în prima tabelă dar nu şi în a doua. O putem
considera o INTERSECŢIE cu propoziţia NOT. Considerăm aceast operator ca opusul
operatorului INTERSECT.
Sintaxa comenzii este:
Operatorul BETWEEN
Operatorul BETWEEN se utilizează pentru definirea intervalelor de valori.
Exemplu : Să se afişeze facturile emise în perioada 1.08.2009 până în 15.09. 2009.
Operatorul LIKE:
Operatorul LIKE permite compararea unui atribut (expresii) cu un literal utilizând o
mască cu ajutorul semnelor %, _.
Exemplu: . Care din lista firmelor din tabela Clienţi sunt firme de tip SRL?
Operatorul IN:
Operatorul IN permite căutarea unei valori într-o listă.
Exemplu:. Care sunt localităţile din judeţele Braşov şi Sibiu
SELECT * FROM LOCALITATI
WHERE Jud IN („BV‟, „SB‟);
Prin clauza JOIN se poate specifica calea de acces la date. Daca numele
atributelor sunt duplicate în cele două tabele legate, pentru fiecare atribut trebuie să se
specifice tabela care îl conţine.
Temă:
a) Să se listeze înregistrările din tabela COMPONENTE care au înregistrări
echivalente în tabela COMENZI
b) Să se listeze toate comenzile care se referă la “BICICLETE CARPAŢI”
c) Să se calculeze suma încasată din vânzarea biciletelor CARPAŢI;
d) Să se genereze factura pe clienți.
Joncţiuni externe
Nu mai combină toate liniile unui tabel cu ale altui tabel şi filtrează numai cele dorite.
Exemple:
a) SELECT P.Cod_c, P.Denumire, P.Preţ
O.Nume, O.Cod-C
FROM COMPONENTE P
JOIN COMENZI O ON COMENZI.Cod_c =54;
Analiză: Rezultatul este format din toate liniile din tabela COMPONENTE îmbinate cu
liniile specificate din tabela COMENZI în care Cod_c=54;
Funcţii totalizatoare:
Fie baza de date: PERSONAL (Marca, Nume, Loc_Munca, Nr_Copii, Salar,
Telefon,….)
Funcţia COUNT – returnează numărul total de linii care respectă clauza WHERE
Exemple: Să se listeze numărul de salariaţii care au salariul mai mare decât 600:
Rezultat: Ieşire:
COUNT (*)
……………
4
Se obține rezultatul:
TOTAL-SALAR
……………………..
15027
Exemplu:
SQL > SELECT AVG (SALAR) SALAR-MEDIU
FROM PERSONAL;
Rezultat - ieşire:
SALAR-MEDIU
……………………..
480
Funcţia MAX – găseşte şi afişează valoarea cea mai mare dintr-o coloană:
Exemplu:
SQL > SELECT MAX (SALAR) TOTAL-SALAR
FROM PERSONAL;
Rezultat- ieşire:
MAX(SALAR)
……………………..
850
Rezultat - ieşire:
MIN(SALAR) MAX(Nr-Copii)
……………………..
290 4
Rezultat- ieşire:
VARIANCE (SALAR)
……………………..
622.5
Rezultat:-ieşire:
STDDEV(SALAR)
……………………..
350
Funcții matematice:
a) Funcţii aritmetice
ABS – afişează valoarea absolută din argument
Exemplu:
SQL > SELECT ABS(A) VAL-ABSOLUTA
FROM NUMERE;
CEIL - afişează cel mai mare număr întreg mai mare sau egal cu argumentul
FLOOR - afişează cel mai mic număr întreg mai mic sau egal cu argumentul
Exemplu:
SQL > SELECT B, CEIL(B)
FROM NUMERE;
Exemplu:
SQL > SELECT A, COS(A*0.0174)
FROM NUMERE;
i) Funcţia INITCAP –
Această funcţie formatează șirul de caractere dintr-un cuvânt şi are ca
efect: scrie prima litera din cuvant litera mare şi celelalte litere mici.
Exemplu:
SQL > SELECT PRENUME , INITCAP(PRENUME)
FROM CARACTERE;
e) Funcţia REPLACE (arg1, arg2, arg3), unde: arg1 este şirul care trebuie căutat, arg2
este cheia de căutare şi arg3 este şirul de înlocuire.
Funcţia REPLACE are ca efect inlocuirea sirului cautat cu sirul propus pentru
inlocuire.
Observaţie: Dacă al treilea argument lipseşte sau este NULL, toate secvenţele identice cu
cheia de căutare din şirul respectiv sunt eliminate.
Exemplu:
SQL > SELECT NUME REPLACE (NUME, „ST‟) INLOCUIRE
FROM CARACTERE;
NUME ÎNLOCUIRE
IONESCU IONESCU
CONSTANTIN CONANTIN
Funcţii diverse:
USER - returnează informaţii despre sistem (adică numele curent al bazei de date)
Exemplu:
SQL > SELECT USER
FROM CONVERSIE;
Clauze SQL: WHERE, STARTING WITH, ORDER BY, GROUP BY, HAVING
Sintaxa generală a instrucţiunii SELECT este:
SGBD ORACLE suportă toţi operatorii de comparaţie (<, =, >, <=, =>), alături de
operatorii logici AND, OR şi NOT. Dacă este folosit NOT, comparaţia ar trebui închisă
în paranteze.
Clauza GROUP BY- permite sumarea unui câmp după un anumit criteriu:
Este folosită de regulă cu funcţii precum COUNT, AVG, SUM. Returnează exact un rând
pentru fiecare valoare unică a coloanei utilizate în clauza GROUP BY. Când este
utilizată, orice atribut folosit trebuie specificat şi în propozitia SELECT sau clauza
DISTINCT. Funcţia este aplicată grupului.
Clauza HAVING:
II. Cereri complexe – interogari care au ca suport datele din mai multe tabele:
În paragrafele anterioare s-au tratat numai cererile care se referă la o singură tabelă. De
aceea condițiile din clauza WHERE erau simple comparații. O facilitate majoră a bazelor
de date relaţionale constă în combinarea înregistrărilor memorate în diferite tabele pentru
a obține informaţii mai multe şi mai complete. În SQL comanda SELECT este utilizată
pentru formularea cererilor din mai multe tabele sub forma:
Subinterogări:
a) Construirea unei subinterogări:
O subinterogare permite să se transmită setul de rezultate al unei interogări la o altă
interogare.
Fie baza de date formata din tabelele COMPONENTE şi COMENZI care au urmatoarea
structură:
COMPONENTE (Cod_c, Denumire, Pret)
COMENZI (Data-C0m, Nume-Cl, Cod-C, Cantitate, Achitat)
Se cere să se extragă din baza de date şi să se listeze câmpurile Data-Com, Cod_c,
Denumire, Cantitate, Achitat, pentru toate înregistrările care se referă la BICICLETA
CARPATI.
c) Imbricarea subinterogărilor:
Temă: Avem baza de date de mai sus. Să se listeze comenzile mai mari decât valoarea
medie.
EXEMPLU - TEST:
Se cere:
1. Creaţi şi scrieţi relaţiile bazei de date utilizând metoda prescurtată; Aduceţi
relaţiile acestei baze de date în FN3;
2. Trasaţi diagrama entitate-asociere.
3. Baza de date “SOFT” este utilizată pentru aplicaţii multi-user realizate în SQL. Se
cere:
1. Să se creeze tabela SALARIATI;
2. Să se adauge în tabela SALARIATI înregistrările de mai jos şi să se listeze această
tabelă, sortată după câmpul Cod_Proiect;
O comanda COMMIT apare automat când se execută o comanda LDD< sau LCD , sau
după o ieşire normală din SQL*Plus.
O comanda ROLLBACK apare automat după o ieşire “anormală” din SQL*Plus sau o
cădere de sistem. Dacă în SQL*Plus se dă comanda SET AUTOCOMMIT ON atunci
toate modificările după comenzile INSERT, UPDATE, DELETE vor fi definitive.
Comanda COMMIT este similară operaţiei de salvare a unui fişier în MS WORD.
Execuţia unei comenzi COMMIT implică:
- Toate modificările (INSERT, DELETE, UPDATE) sunt definitive. Comanda se
referă numai la schimbările făcute de către utilizatorul care dă comanda.
- Toate punctele de salvare vor fi şterse;
- Starea anterioară a datelor este definitiv pierdută;
- Toţi utilizatorii pot vizualiza rezultatele;
- Blocările asupra înregistrărilor afectate sunt eliberate.
Comanda ROLLBACK anulează tranzacţia în curs şi toate modificările de date făcute
după ultima comandă COMMIT.
Pentru tranzacţii care implică execuţia mai multor comenzi SQL sunt necesare puncte de
salvare (savepoint). Un punct de salvare poate fi asociat unei comenzi ROLLBACK prin
comanda:
SAVEPOINT nume_punct_salvare;
Mărimea paginii este setată cu SET PAGESIZE n, unde n este numărul de linii per
pagină. Următoarea comandă va seta pagina la 20 de linii:
SQL>SET PAGESIZE 20
Mărimea liniei este setată folosind SET LINESIZE n, unde n este numărul de caractere
permise pe o linie. Următoarea comandă va seta mărimea liniei la 100 caractere:
Sunt multe opţiuni pentru comanda SET. În HELP-ul sistemului putem examina opţiunile
comenzii SET.
Pentru a afişa o linie de titlu în partea superioară a fiecărei pagini a unui raport se
utilizează Comanda TTITLE, care are sintaxa:
COL n
unde n este poziţia numărului unei coloane, primul caracter al titlului în coloana n a
liniei.
Skip n
unde n este un integer ce spune SGBD ORACLE câte linii să sară după printarea unui
element.
Exemplu. Care este semnificaţia comenzii?
SQL>TTITLE CENTER „LISTA STUDENTI‟ SKIP 2 LEFT „ AN UNIV. 2008-2009‟
BTITLE
Complementar lui TTITLE este Comanda BTITLE. Această Comanda are aceeaşi
opţiune şi formatare ca şi TTITLE, dar printează titlul la sfârşitul fiecărei pagini.
Pentru a face acest raport mai util, vom folosi Comanda BREAK pentru a stabili DEPT
ca şi coloană break. Prin BREAK poţi suprima valori duplicate în DEPT şi plasa linii
goale sau începe o pagină nouă între departamente. Poţi folosi BREAK împreună cu
COMPUTE pentru a calcula liniile de sumar ce conţin salariul total pentru fiecare
departament şi pentru toate departamentele.
Suprimarea valorilor duplicate în coloanele BREAK. Comanda BREAK suprimă
valorile duplicate din default în coloană sau expresia numită. Pentru a suprima valorile
duplicate într-o coloană specificată într-o clauză ORDER BY, se foloseşte cea mai simplă
formă a comenzii BREAK.
BREAK ON break column
Notă: De fiecare dată când este specifică o coloană sau o expresie într-o Comanda
BREAK, se foloseşte clauza ORDER BY pentru a specifica aceeaşi coloană sau
expresie. Dacă nu se procedează astfel, break-ul poate aparea aleator. Pentru a suprima
afişarea departamentelor duplicate în interograre, vom introduce:
Dacă dorim să inserăm linii goale sau pagini goale după fiecare rând folosim următoarea
Comanda pentru a sării n linii:
BREAK ON ROW SKIP n
Folosim următoarea Comanda pentru a sări un număr definit de linii ce formează o
pagină:
BREAK ON ROW SKIP PAGE
Notă: SKIP PAGE sare doar numărul de linii definite să fie o pagină. E posibil ca acestea
să nu conţină o pagină întreagă.
1 SELECT DEPT, FUNCTIE, NUME, SAL FROM salariati WHERE SAL < 2500
2 ORDER BY DEPT, FUNCTIE;
Acum, pentru a sări 3 linii când valoarea DEPT se schimbă şi o linie când valoarea
FUNCTIE se schimbă, se utilizează comanda:
BREAK
Se poate anula actualul break prin Comanda CLEAR cu clauza BREAK
CLEAR BREAKS
Comanda CLEAR BREAKS se poate plasa la începutul fiecărui fişier de comandă pentru
a ne asigura de faptul că anterioarele comenzi BREAK nu vor afecta interogarea ce o
rulăm în fişierul dat.
Pot fi incluse multiple break-uri de coloană şi acţiuni precum sărirea unor linii în
comanda BREAK, atâta timp cât coloana numită după ON în comanda COMPUTE apare
de asemenea şi în comanda BREAK după ON.
Pentru a include coloane multiple de tip break impreună cu comanda COMPUTE, se
utilizează comenzile în următoarea formă:
BREAK ON break_column_1 SKIP PAGE ON break_column_2 SKIP 1
COMPUTE funcţion OF column column column ... ON break_column_2
BREAK ON REPORT
COMPUTE funcţion OF column, column, column... ON REPORT
Pentru a calcula şi afişa totalul salariilor pentru toţi agenţii de vânzării, întâi introducem
următorul BREAK şi COMPUTE:
SQL> BREAK ON REPORT;
SQL> COMPUTE SUM OF SAL ON REPORT;
Apoi introducem şi rulăm o nouă interogare
SQL> SELECT NUME, SAL FROM salarii WHERE Funcţia = 'Analist';
NUME SAL
--------- ------
GEORGESCU 1600
VLAD 1500
ALEXE 1250
MARTIN 1250
******** ------
sum 5600
Efectuarea calculelor:
COMPUTE
Pot fi anulate toate definiţiile de tip COMPUTE prin introducerea comenzii CLEAR cu
clauza COMPUTE.
Pentru a anula definiţiile COMPUTE şi BREAK , se utilizează comenzile:
SQL> CLEAR BREAKS
SQL> CLEAR COMPUTES
SAVE PROG1
(Pentru a salva bufferul într-un fişer cu numele PROG1)
START PROG1
(Pentru a rula programul)
In SGBD ORACLE comanda SQL pentru crearea unei tabele virtuale (vedere/view) este
de forma:
Opțional se poate folosi clauza replace dacă exista deja numele coloanei coloanelor în
vedere. Daca <column(s)> nu sunt specificate în definiția view, coloanele vor avea
aceleași nume cu cele listate în comanda SELECT.
Exemplu:: Următoarea vedere conţine numele, funcţia şi salariu annual al salariațiilor
care lucrează în departamentul 20:
Create view DEPT20 as SELECT ENAME, JOB, SAL_12 ANNUAL SALARY FROM
EMP
WHERE DEPTNO = 20;
În instrucțiunea SELECT aliasul coloanei ANNUAL SALARY este specificat pentru
expresia SAL_12 şi acest alias este dat prin view. O alternativă la această formulare poate
fi:
CREATE VIEW DEPT20 (ENAME, JOB, ANNUAL SALARY) as
SELECT ENAME, JOB, SAL _ 12 FROM EMP WHERE DEPTNO = 20;
O vedere poate fi utilizată în același mod ca o tabelă, adică, rândurile pot fi regăsite dintr-
o vedere, sau aceste rânduri pot fi modificate. O vedere este evaluată din nou de fiecare
dată când este accesată.
În SGBD ORACLE SQL nu sunt permise operațiile de inserare, actualizare sau ștergere
dacă se utilizează la definirea vederi următorii constructori:
• Joins
• Funcţii de agregare ca: sum, min, max etc.
• Operatorii (in, any, all)sau exists în subinterogari;
• clauzele group sau distinct .
O vedere poate fi ștearsă prin Comanda <view-name>.
Structura utilitarului:
- Form Builder (creare VF);
- Form Compiler (creare fişiere executabile);
- Form Runtime (rulare VF).
Form Builder:
Modulele unui VF create astfel, pot fi salvate atât în fişiere cât şi în BD curentă, sub
forma următoarelor tipuri de fişiere:
Cu FORMS BUILDER se pot defini şi rula patru tipuri distincte de VF, şi anume:
SGBD ORACLE oferă metode mai elegante şi eficiente pentru introducerea de date,
vizualizarea sau modificarea datelor din una sau mai multe tabele, prin utilizarea VIDEO
FORMATELOR (SQL FORMS).
Prin SQL FORMS se pot vizualiza datele pe ecran sau se pot introduce date de la
tastatură.
Deci, ZONA:
text;
coloană;
text + coloană.
Structura unui VF:
- Blocul;
- Elemente;
- CANVAS (suprafaţa în care sunt aşezate listele de valori, grafice, vizualizate
elemente, etc.);
- Fereastra;
- Frame;
- Unităţi de program;
- Trigger;
- Alte obiecte.
Meniu END
F1 Meniu 1 F1 Meniu 2
SQL> SQLFORMS;
- FORMS;
- MENUS;
- PL/SQL LIBRARIES (Bibliotecile PL/SQL);
- OBJECT LIBRARIES (Biblioteca de obiecte);
- BUIT-IN PACKAGE (Lista pachetelor PL/SQL);
- DATABASE OBJECT (Obiectele bazei de date).
Modificarea VF
Oricare din operaţiile de la C) se fac numai în cadrul unui bloc, chiar dacă pe ecran
sunt afişate mai multe blocuri.
PARTEA a II-a
Sectiunea I
Facilităţi PL/SQL:
PL/SQL oferă construcţii procedurale cum ar fi variabile, constante şi tipuri.
Limbajul oferă construcţii selective şi iterative construcţiilor SQL. Avantajele majore ale
folosirii PL/SQL sunt:
- integrarea comenzilor de bază SQL;
- definirea şi gestiunea blocurilor de instrucţiuni;
- gestiunea variabilelor şi a constantelor;
- gestiunea cursoarelor explicite şi implicite;
- definirea subprogramelor;
- definirea pachetelor;
- utilizarea structurilor de control fundamentale;
- detectarea şi gestiunea erorilor de execuţie şi a situaţiilor excepţionale.
PL/SQL este necesar pentru a construi aplicaţii cu baze de date care includ
programarea logică, construcţii secvenţiale şi construcţii SQL. Folosind limbajul PL/SQL
se pot construi aplicaţii care pot fi actualizate în timp. PL/SQL îmbină puterea de
manipulare a datelor oferită de SQL , cu puterea de prelucrare a datelor oferită de
limbajele procedurale.
3. Blocuri imbricate:
-- blocuri imbricate
DECLARE
error_flag BOOLEAN :=false;
BEGIN
DBMS_OUTPUT.PUT_LINE ('NUMARAM DE LA 100 LA 1000.');
DECLARE
HUNDREDS_COUNTER NUMBER (1,-2);
BEGIN
HUNDREDS_COUNTER := 100;
LOOP
DBMS_OUTPUT.PUT_LINE (HUNDREDS_COUNTER);
HUNDREDS_COUNTER := HUNDREDS_COUNTER + 100;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('ACEASTA ESTE VALOAREA MAXIMA GASITA');
END;
IF error_flag THEN
DBMS_OUTPUT.PUT_LINE ('NU POT NUMARA ASA MULT');
ELSE
DBMS_OUTPUT.PUT_LINE ('DONE');
END IF;
END;
/
3. Sintaxa pentru declararea unei proceduri:
PROCEDURE nume [(listă_argumente)] {IS,AS}
BEGIN
Cod program
[EXCEPTION
cod tratare erori]
END;
Limbajul PL/SQL lucrează cu un număr de tipuri de date care pot fi grupate în: date de
tip scalar, date de tip obiect, înregistrări şi pointeri. O variabilă de tip scalar este o
variabilă care nu se obţine din combinarea altor variabile. Acest tip de dată se foloseşte
pentru a construi tipuri de date complexe cum ar fi înregistrările şi tablourile (arrays).
PL/SQL lucrează cu următoarele tipuri de date:
Variabilele pot avea orice tip de dată SQL, cum ar fi CHAR, DATE, sau NUMBER, sau
un tip de dată PL/SQL cum ar fi BOOLEAN sau PLS_INTEGER. După fiecare
declaraţie se pune punct şi virgulă. Constantele, variabilele, cursorii şi excepţiile utilizate
în blocul PL/SQL trebuie să fie declarate în secţiunea de declarare a blocului. Clauza
COSTANT arată că o valoare alocată la o variabilă nu poate fi schimbată (variabila
devine constantă).
4.4 Instrucţiuni PL/SQL
Sintaxa comenzii IF
IF condiţie THEN
Instrucţiuni;
[ELSIF conditie THEN
Instrucţiuni ;]
[ELSE instrucţiuni;]
END IF;
Exemplu:
IF (A>=100) THEN
IF ! (B=10) THEN
DBMS_OUTPUT.PUT_LINE („B nu este egal cu 10‟);
ELSIF B<> 11 THEN
DBMS_OUTPUT.PUT_LINE („B nu este egal cu 11‟);
ELSE
DBMS_OUTPUT.PUT_LINE („B diferit de 10, 11‟);
END IF;
END IF;
În cadrul unui program scris în limbajul PL/SQL se pot distinge mai multe structuri de
control:
1. Instrucţiunea IF are 3 forme: IF-THEN, IF-THEN-ELSE şi IF-THEN-ELSIF.
Exemplu:
DECLARE
sales NUMBER(8,2) := 12100;
quota NUMBER(8,2) := 10000;
bonus NUMBER(6,2);
emp_id NUMBER(6) := 120;
BEGIN
IF sales > (quota + 200) THEN
bonus := (sales - quota)/4;
ELSE
bonus := 50;
END IF;
UPDATE employees SET salary = salary + bonus WHERE employee_id = emp_id;
END;
b. Sintaxa pentru instrucţiunea IF...THEN...ELSE
IF <condiții>
THEN
<instrucţiuni care se execută dacă condiții = TRUE>
ELSE
<instrucţiuni care se execută dacă condiții = FALSE>
END IF;
IF <condiții1>
THEN
<instrucţiuni care se execută dacă condiții1= TRUE>
ELSIF <condiții2 >
THEN
<instrucţiuni care se execută dacă condiții2= TRUE>
ELSIF <condiții3 >
THEN
<instrucţiuni care se execută dacă condiții3= TRUE>
.....
ELSE
<instrucţiuni care se execută dacă condiții = FALSE>
END IF;
2. Instrucţiunea CASE
Pentru a nuanţa salturile în secvenţa de program în funcţie de valoarea condiţiei se
foloseşte instrucţiunea CASE, care are sintaxa:
CASE variabilă
WHEN ‟A‟ THEN
Instrucţiuni
WHEN ‟B‟ THEN
Instrucţiuni
WHEN ‟C‟ THEN
Instrucţiuni
.....
ENDCASE;
3. Instrucţiunea GO TO
Instrucţiunea GO TO asigură saltul necondiţionat la instrucţiunea cu eticheta indicată.
Scopul acestei instrucţiuni este de a asigura saltul (ieşirea) dintr-un subloc, dintr-un ciclu,
dintr-o instrucţiune IF. Sintaxa acestei instrucţiuni este:
GO TO etichetă;
Exemplu:
DECLARE
I POSITIVE:=1;
Max_loop CONSTANT POSITIV :=100;
BEGIN
I := 1;
LOOP
I :=i+1;
EXIT WHEN I > max_loop;
GOTO mai_mult;
END IF;
END LOOP;
<< mai_mult>>
I :=1;
END;
DECLARE
A_a INTEGER;
BEGIN
SELECT COUNT(*) INTO A_a from imprumută;
FOR i IN 1..a_a LOOP
…………
END LOOP;
……………
END;
8.Instrucţiunea EXIT
Această instrucţiune forţează ieşirea dintr-o buclă.
Exemplu:
DECLARE
I POSITIVE:=1;
Max_loop CONSTANT POSITIVE :=100;
BEGIN
LOOP
I :=i+1;
EXIT WHEN I > max_loop;
END LOOP;
END;
Exemplu:
IF count > 100 THEN EXIT;
ENDIF;
sau
EXIT WHEN count > 100;
Cele 2 construcţii de mai sus sunt echivalente, dar EXIT ...WHEN este mai uşor de
înţeles.
Temă: Daţi 2 exemple de programe în PL/SQL care folosesc structurile de control LOOP,
folosind obiectele din baza de date creată de voi !
Cursorul este o zonă de memorie, în care se scriu 0 sau n rânduri dintr-o tabelă, printr-o
cerere SELECT. Cursorul determină o bază de date să se comporte ca baza de date de tip
ISAM (acces indexat secvenţial). Pentru a utiliza mecanismul cursorului trebuie să se
parcurgă urmatoarele etape:
1. Declarare cursor – etapa de definire a instrucţiunii SELECT care va fi utilizată şi
eventualele opţiuni privind cursoarele;
2. Deschidere cursor – etapa în care se încarcă efectiv datele, folosind instrucţiunea
SELECT definită anterior;
3. Regăsirea rândurilor (înregistrărilor) individuale – conform necesităţilor;
4. Închidere cursor.
Când această instrucţiune este prelucrată, interogarea este executată şi datele regăsite sunt
stocate în vederea operaţiilor ulterioare de navigare şi derulare. Datele din cursor sunt
accesibile prin instrucţiunea FETCH.
Există două tipuri de cursoare:
- implicite care sunt generate de serverul ORACLE când în partea executabilă a
unui bloc PL/SQL apare o instrucţiune SQL;
- explicite – declarate şi definite de către utilizator atunci când o cerere SELECT
întoarce ca rezultat mai mult decât o linie (înregistrare).
Cursorul se deschide pentru acces (OPEN) şi este accesat secvenţial prin (FETCH).
Definirea cursorului se face în partea declarativă a blocului, prin instrucţiunea
CURSOR, iar execuţia prin instrucţiunile care manipulează cursorul: OPEN, FETCH,
CLOSE. Prin cursor se pot obţine informaţii despre execuţia instrucţiunilor: INSERT,
UPDATE, DELETE, SELECT.
Utilizarea cursoarelor implicite: atributele acestor cursoare oferă informaţii
despre executarea ultimei comenzi.
Exemplu: Excepţiile (erorile) ce pot să apară la execuţia comenzii SELECT pot fi
sesizate cu ajutorul atributelor:
% ROWCOUNT – returnează numărul de linii afectate de ultima instrucţiune
SQL;
%FOUND – atributul are valoarea TRUE dacă ultima comandă SQL afectează
una sau mai multe linii;
%NOTFOUND - atributul are valoarea TRUE dacă ultimă comandă SQL nu
afectează nici o linie.