Sunteți pe pagina 1din 49

SQL recapitulare SQL*

1. S-au introdus clauzele noi pentru instructiunile: SELECT, UPDATE, DELETE, INSERT, folosite n PL/SQL. De exemplu: SELECT INTO INSERT INTO ( ) VALUES (...) RETURNING INTO variabile de legatura UPDATE RETURNING INTO variabile de legatura DELETE .. RETERNING INTO variabile de legatura 2. Se prezint utilitarul SQL* SQL SQL (Structured Query Language) este un limbaj neprocedural pentru interogarea i prelucrarea informaiilor din baza de date. De asemenea, SQL este un limbaj declarativ, asfel nct este suficient ca utilizatorul doar s descrie ceea ce trebuie obinut, fr a indica modul n care se ajunge la rezultat. Compilatorul limbajului SQL genereaz automat o procedur care acceseaz baza de date i execut comanda dorit. SQL permite att definirea, prelucrarea i interogarea datelor, ct i controlul accesului la acestea. Comenzile SQL pot fi integrate n programe scrise n alte limbaje, de exemplu Cobol, C, C++, Java etc. Principalele aspecte prin care SQL difer de limbajele de programare tradiionale sunt urmtoarele: asigur accesarea automat a datelor; opereaz asupra unor mulimi de date, i nu asupra elementelor individuale; permite programarea la nivel logic, necesitatea de a considera detaliile

implementrii fiind redus. Oracle SQL include extensii ale limbajului SQL standard ANSI/ISO, iar instrumentele i aplicaiile Oracle furnizeaz instruciuni suplimentare. Utilitarele SQL*Plus i Oracle Enterprise Manager permit att executarea instruciunilor limbajului SQL standard asupra unei baze de date Oracle, ct i a instruciunilor sau funciilor suplimentare disponibile. Dei unele utilitare i aplicaii Oracle simplific sau mascheaz utilizarea SQL, toate operaiile asupra bazei de date sunt realizate folosind acest limbaj. Caracteristicile limbajului SQL pot fi sintetizate astfel: este abordabil de diferite categorii de utilizatori, inclusiv de aceia care au puin experien n programare; este un limbaj neprocedural, de comunicare cu server-ul Oracle; reduce timpul necesar crerii i ntreinerii aplicaiilor de baze de date Consideraii generale n funcie de tipul aciunii pe care o realizeaz, instruciunile SQL se mpart n mai multe categorii. Datorit importanei pe care o au comenzile componente, unele dintre aceste categorii sunt evideniate ca limbaje n cadrul SQL, i anume: limbajul de definire a datelor (LDD); limbajul de interogare a datelor (LQD); limbajul de prelucrare a datelor (LMD); limbajul de control al datelor (LCD). Pe lng comenzile care alctuiesc aceste limbaje, SQL cuprinde: instruciuni pentru controlul sesiunii; instruciuni pentru controlul sistemului; instruciuni SQL ncapsulate. Limbajul de definire a datelor n general, instruciunile LDD sunt utilizate pentru definirea structurii corespunztoare obiectelor unei scheme. Aceste comenzi permit: crearea, modificarea i suprimarea obiectelor unei scheme i a altor obiecte ale bazei de date, inclusiv baza nsi i utilizatorii acesteia

(CREATE, ALTER, DROP); modificarea numelor obiectelor unei scheme (RENAME); tergerea datelor din obiectele unei scheme, fr suprimarea structurii obiectelor respective (TRUNCATE); Implicit, o instruciune LDD permanentizeaz efectul tuturor instruciunilor precedente i marcheaz nceputul unei noi tranzacii. Odat cu lansarea unei instruciuni LDD, sistemul Oracle declaneaz implicit instruciuni SQL care modific informaia din dicionarul datelor. Limbajul de interogare a datelor (LQD) Exista o singura instruciune a limbajului LQD folosit pentru regsirea datelor dintr-unul sau mai multe tabele (SELECT)

Limbajul de prelucrare a datelor Instruciunile LMD sunt utile pentru interogarea i prelucrarea datelor din obiectele unei scheme. Aceste instruciuni permit: adugarea de nregistrri n tabele sau vizualizri (INSERT); modificarea valorilor unor coloane din nregistrrile existente n tabele sau vizualizri (UPDATE); adugarea sau actualizarea condiionat a nregistrrilor n tabele sau vizualizri (MERGE); suprimarea de nregistrri din tabele sau vizualizri (DELETE); Limbajul de control al datelor Instruciunile LCD gestioneaz modificrile efectuate de ctre comenzile LMD i grupeaz aceste comenzi n uniti logice, numite tranzacii. Aceste instruciuni permit: permanentizarea modificrilor unei tranzacii (COMMIT); anularea modificrilor dintr-o tranzacie fie n ntregime, fie ncepnd de la un punct intermediar (ROLLBACK); definirea unui punct intermediar pn la care tranzacia poate fi anulat (SAVEPOINT); stabilirea de proprieti ale tranzaciei (SET TRANSACTION TO).

Cursoare Un cursor reprezint o zon de memorie n care se reine o instruciune SQL analizat i informaii utile procesrii acesteia. Sistemul Oracle gestioneaz n mod automat cursoarele. n dezvoltarea unei aplicaii, un cursor constituie o resurs disponibil care poate fi utilizat pentru analizarea sintactic i semantic explicit a instruciunilor SQL ncapsulate n aplicaie. Fiecare sesiune poate deschide mai multe cursoare, pn la limita stabilit de parametrul de iniializare OPEN_CURSORS. Pentru a elibera memoria sistemului, se recomand ca aplicaiile s prevad nchiderea cursoarelor care nu mai sunt necesare. Execuia unui cursor plaseaz rezultatul cererii asociate ntr-o mulime de linii (mulime rezultat), care pot fi regsite secvenial sau nesecvenial. Cursoarele scrollable sunt cele pentru care operaiile LMD i de regsire nu trebuie s se desfoare secvenial, ntr-un singur sens (de la nceput ctre sfrit). Exist interfee care permit regsirea de linii recuperate anterior, recuperarea liniei n din mulimea rezultat sau recuperarea celei de-a n-a linii de la poziia curent. Zona SQL partajat Sistemul Oracle sesizeaz automat situaia n care aplicaiile lanseaz instruciuni SQL similare. Zona SQL utilizat pentru procesarea unei instruciuni la prima sa apariie este partajat, ceea ce nseamn c poate fi utilizat pentru procesarea apariiilor ulterioare ale aceleiai instruciuni. Pentru o anumit instruciune poate exista o singur zon SQL partajat. Aceste zone pot fi utilizate de ctre orice proces Oracle. Partajarea zonelor SQL reduce utilizarea memoriei pe server-ul bazei de date. Procesarea instruciunilor SQL n general, procesarea oricrei instruciuni SQL presupune urmtoarele etape: crearea unui cursor, analiza instruciunii, legarea variabilelor, executarea instruciunii i nchiderea cursorului. Interogrile solicit cteva etape suplimentare: descrierea rezultatelor, definirea modului de prezentare a acestora i recuperarea liniilor selectate. Un cursor este creat independent de instruciunea SQL. El este generat automat, n ateptarea unei instruciuni SQL creia s i fie asociat. n timpul analizei, instruciunea este transferat de la procesul utilizator la sistemul Oracle. Sistemul Oracle analizeaz instruciunea doar dac nu exist deja o zon

SQL partajat n library cache, zon care s conin reprezentarea instruciunii. n caz contrar, sistemul analizeaz instruciunea i genereaz reprezentarea corespunztoare, creia procesul utilizator i aloc o zon partajat SQL n library cache. Dup asocierea la o zon partajat SQL, o instruciune poate fi executat n mod repetat fr a fi necesar reanalizarea acesteia. n etapa de analiz sunt identificate acele erori care pot fi depistate naintea execuiei instruciunii. Unele erori, cum ar fi cele aprute n urma conversiei datelor sau nerespectrii constrngerilor de integritate, pot fi depistate i raportate doar n faza de execuie a instruciunii. Descrierea rezultatelor unei cereri determin caracteristicile rezultatului (tipuri de date, dimensiuni, nume). Dac este necesar, sistemul efectueaz conversii implicite ale valorilor returnate. O instruciune poate face referin la variabile ale cror valori trebuie cunoscute n vederea execuiei. Procesul obinerii acestor valori are loc n etapa de legare a variabilelor (binding variables). Execuia unei instruciuni UPDATE sau DELETE determin blocarea liniilor afectate de aceasta. Scopul unei astfel de operaii este asigurarea integritii datelor. Liniile sunt deblocate la permanentizarea sau anularea tranzaciei corespunztoare comenzii respective. Instruciunile SELECT i INSERT nu determin blocri. Etapa de recuperare a liniilor unei cereri presupune selectarea i, eventual, ordonarea lor. Procesarea oricrei instruciuni SQL se finalizeaz prin nchiderea cursorului asociat, adic eliberarea zonei de memorie utilizate n scopul prelucrrii. Comentarii Comentariile pot fi asociate instruciunilor SQL sau obiectelor schemei. Ele nu afecteaz execuia instruciunilor SQL, dar permit ca aplicaia s fie mai uor de citit i ntreinut. ntr-o instruciune, un comentariu poate aprea ntre orice cuvinte cheie, parametri sau semne de punctuaie. Includerea unui comentariu se poate efectua n dou moduri. Textul comentat este ncadrat de caracterele /* i */ i poate ocupa mai multe linii. Nu este necesar separarea de text a acestor caractere, printr-un spaiu sau o linie liber. Comentariul ncepe cu secvena --, urmat de textul propriu-zis. n acest caz, comentariul se termin la sfritul liniei.

Limbajul de prelucrare a datelor


SQL furnizeaz comenzi ce permit consultarea (SELECT) i actualizarea (INSERT, UPDATE, DELETE, MERGE) coninutului bazei de date. Aceste comenzi definesc limbajul de prelucrare a datelor (LMD). Comenzile limbajului LMD pot fi: formulate direct, utiliznd interfaa SQL*PLUS ; utilizate n utilitare ale sistemului ORACLE; ncapsulate ntr-un program PL/SQL ; ncapsulate ntr-un program scris n limbaj gazd. n funcie de momentul n care se dorete realizarea actualizrilor asupra bazei de date, utilizatorul poate folosi una din urmtoarele comenzi: SET AUTOCOMMIT ON schimbrile se efectueaz imediat; SET AUTOCOMMIT OFF schimbrile sunt pstrate ntr-un buffer pn la execuia uneia din comenzile: COMMIT, care are rolul de a permanentiza schimbrile efectuate; ROLLBACK, care determin renunarea la schimbrile realizate. Limbajul de prelucrare a datelor face parte din nucleul limbajului SQL i conine mecanisme pentru interogarea i reactualizarea obiectelor unei scheme a bazei de date. Pentru tabele i vizualizri, instruciunile LMD permit: adugarea de noi nregistrri (INSERT) explicit sau ca rezultat al unor interogri; modificarea valorilor coloanelor din nregistrrile existente (UPDATE); suprimarea de nregistrri (DELETE). De asemenea, LMD cuprinde instruciuni care determin: adugarea sau modificarea condiionat de nregistrri (MERGE); vizualizarea planului de execuie propus de ctre optimizor pentru o instruciune SQL (EXPLAIN PLAN); blocarea unui tabel, limitnd temporar accesul altor utilizatori la acesta (LOCK TABLE).

Comanda SELECT Una dintre cele mai importante comenzi ale limbajului de prelucrare a datelor este SELECT. Cu ajutorul ei pot fi extrase submulimi de valori att pe vertical (coloane), ct i pe orizontal (linii) din unul sau mai multe tabele. Sintaxa comenzii este simpl, apropiat de limbajul natural. SELECT INTO FROM [WHERE [START WITH [CONNECT BY [GROUP BY [HAVING [ORDER BY [FOR UPDATE NOWAIT}] Prezena clauzelor SELECT i FROM este obligatorie deoarece acestea specific coloanele selectate, respectiv tabelele din care se vor extrage datele. Prezena clauzei INTO indic variabilele declarate sau variabile de legatur, care pstreaza valorile selectate n vederea recuperrii lor n blocuri PL/SQL. Tabelele specificate n clauza FROM pot fi urmate de un alias, care va reprezenta numele folosit pentru referirea tabelului respectiv n cadrul instruciunii. Eliminarea duplicatelor se poate realiza folosind clauza DISTINCT. Dac nu se specific parametrul DISTINCT, parametrul ALL este implicit i are ca efect afiarea dublurilor. Simbolul * permite selectarea tuturor atributelor din tabelele asupra crora se execut cererea. Atributele sau expresiile din lista clauzei SELECT pot conine alias-uri, care vor reprezenta numele cmpurilor respective n cadrul tabelului furnizat ca rezultat de instruciunea SELECT. Clauza WHERE poate fi folosit pentru a impune anumite condiii liniilor din care se vor extrage atributele specificate n clauza SELECT. [ALL | DISTINCT] {* | list de atribute selectate | expr AS alias} { list de variabile declarate/variabile de legatura} { [schema.]{tabel [PARTITION (partition_name)] | [THE] (subquery)} [alias_tabel] } condiie] condiie] condiie] list de expresii condiie]] {expresie | poziie | c_alias} [ASC | DESC]] [OF [schema.]{table | view}.coloan] [{WAIT n |

Clauza GROUP BY grupeaz nregistrrile dup anumite cmpuri; n cazul prezenei acestei clauze, clauza HAVING poate impune restricii suplimentare asupra rezultatului final. Ordonarea nregistrrilor se poate face cu ajutorul clauzei ORDER BY. Cu ajutorul parametrilor ASC i DESC se poate specifica ordonarea cresctoare, respectiv descresctoare a nregistrrilor. Pentru o secven cresctoare valorile null sunt afiate ultimele. Dac nu se face nici o specificaie, atunci ordinea de returnare este la latitudinea server-ului. Clauza FOR UPDATE permite blocarea coloanei (coloanelor) nainte de a actualiza sau terge nregistrri din tabelele bazei de date. Prin folosirea clauzei NOWAIT se va genera o excepie i nu se va mai atepta pn la ridicarea blocajelor de pe nregistrri. Exemplu (SELECT cu clauza INTO) S se creeze un bloc anonim n care se declar o variabil v_job de tip job_title (%TYPE) a crei valoare va fi titlul jobului salariatului avnd codul 200. DECLARE v_job jobs.job_title%TYPE; BEGIN SELECT job_title INTO v_job FROM employees e, jobs j WHERE e.job_id=j.job_id AND employee_id=200; DBMS_OUTPUT.PUT_LINE('jobul este '|| v_job); END; / Varianta 2 S se rezolve problema anterioar utiliznd variabile de legtur. S se afieze rezultatul att din bloc, ct i din exteriorul acestuia. VARIABLE rezultat VARCHAR2(35) BEGIN SELECT job_title INTO :rezultat FROM employees e, jobs j WHERE e.job_id=j.job_id AND employee_id=200; DBMS_OUTPUT.PUT_LINE('rezultatul este '|| :rezultat);

END; / PRINT rezultat Exemplu (SELECT cu clauza INTO) S se creeze un bloc anonim n care se declar o variabil v_job_hiredate de tip hire_date%TYPE i o variabil v_emp_salary de tip salary%TYPE pentru angajatul care are ID=100. DECLARE v_emp_hiredate employees.hire_date%TYPE; v_emp_salary employees.salary%TYPE; BEGIN hire_date, salary INTO v_emp_hiredate, v_emp_salary FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Data_angajarii este: ' || v_emp_hiredate || ' si Salariu este: ' || v_emp_salary); END; /

Funcii n SQL
Exista doua tipuri de functii: care opereaza pe o linie si returneaza un rezultat pe linie (single row functions); care opereaza pe un grup de linii si returneaza un rezultat pe grup de linii (functii grup sau multiple row functions). Single row functions pot s fie: funcii pentru prelucrarea caracterelor, funcii aritmetice, funcii pentru prelucrarea datelor calendaristice, funcii de conversie, funcii generale (NVL, NVL2, NULLIF, CASE, DECODE etc.). Funcii de conversie Conversiile pot fi fcute:

implicit de ctre server-ul Oracle ; explicit de ctre utilizator. Conversii implicite n cazul atribuirilor, sistemul poate converti automat: VARCHAR2 sau CHAR n NUMBER ; VARCHAR2 sau CHAR n DATE; VARCHAR2 sau CHAR n ROWID; NUMBER, ROWID, sau DATE n VARCHAR2. Pentru evaluarea expresiilor, sistemul poate converti automat: VARCHAR2 sau CHAR n NUMBER, dac irul de caractere reprezint un numr; VARCHAR2 sau CHAR n DATE, dac irul de caractere are formatul implicit DD-MON-YY; VARCHAR2 sau CHAR n ROWID. Conversii explicite funcia TO_CHAR convertete data calendaristic sau informaia numeric n ir de caractere conform unui format; funcia TO_NUMBER convertete un ir de caractere n numr; funcia TO_DATE convertete un ir de caractere n dat calendaristic conform unui format. Dac formatul este omis, convertirea se face conform unui format implicit. Funcia TO_DATE are forma TO_DATE(ir_de_caractere [,fmt]). Funcia este utilizat dac se dorete conversia unui ir de caractere care nu are formatul implicit al datei calendaristice (DD-MON-YY). Exemple: SQL> SELECT TO_DATE('Feb 22, 2010','Mon dd, RRRR') as data 2 from dual; DATA --------22-FEB-10 SQL> SELECT TO_DATE('January 1, 2010','Month DD, YYYY') 2 AS "New Year"

3 FROM dual; New Year --------01-JAN-10 SQL> SELECT TO_CHAR(SYSDATE,'Month ddth, yyyy') AS TODAY 2 FROM dual; TODAY -------------------February 21st, 2010 SQL> SELECT TO_NUMBER('232.55','999.99') AS converted 2 from dual; CONVERTED ---------232.55 Funcii pentru prelucrarea caracterelor LENGTH(string) returneaz lungimea irului de caractere string; LENGTHB(string) ndeplinete aceai funcie ca i LENGTH, cu deosebirea c returneaz numrul de octei ocupai; SUBSTR(string, start [,n]) returneaz subirul lui string care ncepe pe poziia start i are lungimea n; dac n nu este specificat, subirul se termin la sfritul lui string; LTRIM(string [,chars]) terge din stnga irului string orice caracter care apare n chars pn la gsirea primului caracter care nu este n chars; dac chars nu este specificat, se terg spaiile libere din stnga lui string; RTRIM(string [,chars]) este similar funciei LTRIM, cu excepia faptului c tergerea se face la dreapta irului de caractere; LPAD(string, length [,chars]) adaug chars la stnga irului de caractere string pn cnd lungimea noului ir devine length; n cazul n care chars nu este specificat, atunci se adaug spaii libere la stnga lui string;

RPAD(string, length [,chars]) este similar funciei LPAD, dar adugarea de caractere se face la dreapta irului; REPLACE(string1, string2 [,string3]) returneaz string1 cu toate apariiile lui string2 nlocuite prin string3; dac string3 nu este specificat, atunci toate apariiile lui string2 sunt terse; INITCAP(string) transform primul caracter al irului n majuscul; INSTR(string, chars [,start [,n]]) caut n string, ncepnd de de la poziia start, a n-a apariie a secvenei chars i ntoarce poziia respectiv; dac start nu este specificat, cutarea se face de la nceputul irului; dac n nu este specificat, se caut prima apariie a secvenei chars; UPPER(string), LOWER(string) transform toate literele irului de caractere string n majuscule, respectiv minuscule; ASCII(char) returneaz codul ASCII al unui caracter; CHR(num) returneaz caracterul corespunztor codului ASCII specificat; CONCAT(string1, string2) realizeaz concatenarea a dou iruri de caractere;

Funcii aritmetice Cele mai importante funcii aritmetice sunt: ABS (valoarea absolut), ROUND (rotunjire cu un numr specificat de zecimale), TRUNC (trunchiere cu un numr specificat de zecimale), EXP (ridicarea la putere a lui e), LN (logaritm natural), LOG (logaritm ntr-o baz specificat), MOD (restul mpririi a dou numere specificate), POWER (ridicarea la putere), SIGN (semnul unui numr), COS (cosinus), COSH (cosinus hiperbolic), SIN(sinus), SQRT(rdcina ptrat), TAN(tangent), funciile LEAST i GREATEST, care returneaz cea mai mic, respectiv cea mai mare valoare a unei liste de expresii etc. Funcii pentru prelucrarea datelor calendaristice SYSDATE returneaz data i timpul curent; ADD_MONTHS(d, count) returneaz data care este dup count luni de la data d; NEXT_DAY(d, day) returneaz urmtoarea dat dup data d, a crei zi a sptmnii este cea specificat prin irul de caractere day;

LAST_DAY(d) returneaz data corespunztoare ultimei zile a lunii din care data d face parte; MONTHS_BETWEEN(d2, d1) returneaz numrul de luni dintre cele dou date calendaristice specificate; NEW_TIME(data, zona_intrare, zona_iesire) returneaz ora din zona_intrare corespunztoare orei din zona_iesire; ROUND(d) dac data d este nainte de miezul zilei, ntoarce data d cu timpul setat la ora 12:00 AM; altfel, este returnat data corespunztoare zilei urmtoare, cu timpul setat la ora 12:00 AM; TRUNC(d) ntoarce data d, dar cu timpul setat la ora 12:00 AM (miezul nopii); LEAST(d1, d2, , dn), GREATEST(d1, d2, , dn) returneaz, dintr-o list de date calendaristice, prima, respectiv ultima dat n ordine cronologic. Exemplu: ROUND(25-jul-95, MONTH) este 01-AUG-95, ROUND(25-jul-95, YEAR) este 01-JAN-96, TRUNC(25-jul-95, MONTH) este 01-JUL-95, TRUNC(25-jul-95, YEAR) este 01-JAN-95. 1. SQL> SELECT ROUND(SYSDATE, 'MONTH') AS Luna viitoare 2 FROM DUAL; Luna viit --------01-MAR-10 2. SQL> SELECT TRUNC(SYSDATE, 'MONTH') AS "Inceput Luna " 2 FROM DUAL; Inceput L --------01-FEB-10 3. SQL> SELECT ROUND(SYSDATE, 'YEAR') AS "Inceput An" 2 FROM DUAL; Inceput A

--------01-JAN-10 4. SQL> SELECT TRUNC(SYSDATE, 'YEAR') AS "Inceput An" 2 FROM DUAL; Inceput A --------01-JAN-10 Observatie: - Dac ziua este > decat 15, atunci ROUND adauga o luna, altfel i ROUND si TRUNC afieaza inceputul lunii curente. - Dac data curenta are luna > 6 atunci ROUND adauga 1 an la data, altfel i ROUND si TRUNC afieaza inceputul anului curent. Exemplu: 1. SQL> SELECT SYSDATE+1 AS tomorrow 2 FROM dual; TOMORROW --------22-FEB-10 2. Adauga 10 ani la data curenta SQL> SELECT ADD_MONTHS(SYSDATE, 120) "Peste 10 ani" 2 FROM dual; Peste 10 --------21-FEB-20 3. MONTHS_BETWEEN intorce numarul de luni dintre doua date. SQL> SELECT last_name as NUME, hire_date as "Data_angajarii ", 2 TO_CHAR(MONTHS_BETWEEN (SYSDATE, hire_date ), '999,999,999.99') 3 AS " Luni_Muncite" 4 FROM employees 5 WHERE employee_id=200; NUME Data_anga Luni_Munc

------------------------- --------- --------------Whalen 17-SEP-87 269.16 Utilizarea literelor mari sau mici n formatul unei date calendaristice precizeaz forma rezultatului. De exemplu, MONTH va da rezultatul MAY, iar Month va da rezultatul May. Pentru afiarea cmpurilor de tip dat calendaristic sau pentru calcule n care sunt implicate aceste cmpuri, exist funcii specifice. Cteva din elementele care apar n formatul unei date calendaristice sunt prezentate n tabelul urmtor. Format
SS SSSSS MI HH HH24 DAY D DD DDD MM MON MONTH YY YYYY YEAR CC Q W WW

Descriere
Secunda relativ la minut Secunda relativ la zi Minut Ora Ora Numele zilei sptmnii Ziua sptmnii Ziua lunii Ziua anului Numrul lunii Numele prescurtat al lunii Luna Ultimele dou cifre ale anului Anul Anul n litere Secolul Numrul trimestrului Sptmna lunii Sptmna anului

Domeniu
0-59 0-86399 0-59 0-12 0-24 SUNDAY-SATURDAY 1-7 1-31 (depinde de lun) 1-366 (depinde de an) 1-12 JAN-DEC JANUARY-DECEMBER de exemplu, 99 de exemplu, 1999 de exemplu, 17 1-4 1-5 1-52

Exemplu: Pentru operele achiziionate n ultimii 2 ani, s se afieze codul galeriei n care sunt expuse, data achiziiei, numrul de luni de la cumprare, data primei verificri, prima zi n care au fost expuse ntr-o galerie i ultima zi a lunii n care au fost achiziionate. Se va considera c data primei verificri este dup 10 luni de la achiziionare, iar prima expunere ntr-o galerie a avut loc n prima zi de duminic dup achiziionare. SELECT cod_galerie, data_achizitiei, MONTHS_BETWEEN(SYSDATE, data_achizitiei) "Numar luni",

ADD_MONTHS(data_achizitiei, 10) "Data verificare", NEXT_DAY(data_achizitiei, 'SUNDAY') Expunere, LAST_DAY(data_achizitiei) FROM opera WHERE MONTHS_BETWEEN(SYSDATE, data_achizitiei) <= 24; Funcii generale DECODE(value, if1, then1, if2, then2, , ifN, thenN, else) returneaz then1 dac value este egal cu if1, then2 dac value este egal cu if2 etc.; dac value nu este egal cu nici una din valorile if, atunci funcia ntoarce valoarea else (selecie multipl); NVL(e1, e2) dac e1 este NULL, returneaz e2; altfel, returneaz e1; NVL2(e1, e2, e3) dac e1 este NOT NULL, atunci returneaz e2, altfel, returneaz e3; NULLIF(e1, e2) returneaza null daca e1=e2 si returneaza e1 daca e1 nu este egal cu e2; COALESCE(e1, e2, en) returneaza prima expresie care nu este null din lista de expresii (expresiile trebuie sa fie de acelasi tip).

Exemplu: NVL(comision, 0) este 0 dac comisionul este null. Prin urmare, expresia salariu*12 + comision nu este corect, deoarece rezultatul su este null dac comisionul este null. Forma corect este salariu*12 + NVL(comision, 0). Exemplu: S se afieze preul modificat al unor cri n funcie de editur. Pentru crile din editura ALL s se dubleze preurile, pentru cele din editura UNIVERS s se tripleze preurile, iar pentru cele din editura XXX s se reduc la jumtate acest pre. SELECT pret,editura, DECODE(editura, ALL,pret*2, UNIVERS,pret*3, XXX,pret/2, pret) pret_revizuit FROM carte; Expresia CASE returneaza null daca nu exista clauza ELSE si daca nici o conditie nu este indeplinita. SELECT nume, sal,

(CASE WHEN sal <5000 THEN 'LOW' WHEN sal <10000 THEN 'MEDIUM' WHEN sal <20000 THEN 'GOOD' ELSE 'EXCELLENT' END) AS calificare FROM salariat;

Funcii grup
AVG (media aritmetic), COUNT(*) (numrul de linii returnate de o cerere), COUNT ([DISTINCT] numrul valorilor unui expresii), SUM (suma valorilor unei expresii), MIN (valoarea minim a unei expresii), MAX (valoarea maxim a unei expresii), STDDEV (deviaia standard), VARIANCE (dispersia).

Operatorul ROLLUP Operatorul ROLLUP produce o mulime care conine liniile obinute n urma gruprii obinuite i linii pentru subtotaluri. Acest operator furnizeaz valori agregat i superagregat corespunztoare expresiilor din clauza GROUP BY. Operatorul ROLLUP creeaz grupri prin deplasarea ntr-o singur direcie, de la dreapta la stnga, de-a lungul listei de coloane specificate n clauza GROUP BY. Apoi, se aplic funcia agregat acestor grupri. Dac sunt specificate n expresii n operatorul ROLLUP, numrul de grupri generate va fi n + 1. Liniile care se bazeaz pe valoarea primelor n expresii se numesc linii obinuite, iar celelalte se numesc linii superagregat. Daca in clauza GROUP BY sunt specificate n coloane, atunci pentru a produce subtotaluri in n dimensiuni ar fi necesare n+1 operatii SELECT legate prin UNION ALL. Aceasta ar fi total ineficient, deoarece fiecare SELECT ar implica o parcurgere a tabelului. Operatorul ROLLUP are nevoie de o singura parcurgere a tabelului. Exemplu:

S se afieze codurile de galerii mai mici dect 50, iar pentru fiecare dintre acestea i pentru fiecare autor care are opere expuse n galerie, s se listeze valoarea total a lucrrilor sale. De asemenea, se cere valoarea total a operelor expuse n fiecare galerie. Rezultatul va conine i valoarea total a operelor din galeriile avnd codul mai mic dect 50, indiferent de codul autorului. SELECT cod_galerie, cod_artist, SUM(valoare) FROM opera WHERE cod_galerie < 50 GROUP BY ROLLUP(cod_galerie, cod_artist); Instruciunea precedent va avea un rezultat de forma:

COD_GALERIE 10 10 10 40 40

COD_ARTIST 50 60 50

SUM(VALOARE) 14000 10000 24000 8080 8080 32080

Operatorul CUBE Operatorul CUBE grupeaz liniile selectate pe baza valorilor tuturor combinaiilor posibile ale expresiilor specificate i returneaz cte o linie totalizatoare pentru fiecare grup. El produce subtotaluri pentru toate combinaiile posibile de grupri specificate n GROUP BY, precum i un total general. Daca exista n coloane sau expresii in clauza GROUP BY, vor exista 2 n combinatii posibile superagregat. Matematic, aceste combinatii formeaza un cub n-dimensional. Pentru producerea de subtotaluri fara ajutorul operatorului CUBE ar fi necesare 2 n instructiuni SELECT legate prin UNION ALL. Exemplu: S se afieze valoarea total a operelor de art ale unui autor, expuse n

cadrul fiecrei galerii avnd codul mai mic dect 50. De asemenea, s se afieze valoarea total a operelor din fiecare galerie avnd codul mai mic dect 50, valoarea total a operelor fiecrui autor indiferent de galerie i valoarea total a operelor din galeriile avnd codul mai mic dect 50. SELECT cod_galerie, cod_artist, SUM(valoare) FROM opera WHERE cod_galerie < 50 GROUP BY CUBE(cod_galerie, cod_artist) COD_GALERIE 10 10 10 40 40 50 60 50 COD_ARTIST 50 60 SUM(VALOARE) 14000 10000 24000 8080 8080 22080 10000 32080 Funcia GROUPING Aceasta funcie este util pentru: determinarea nivelului de agregare al unui subtotal dat, adic a grupului sau grupurilor pe care se bazeaz subtotalul respectiv; identificarea provenienei unei valori null a unei expresii calculate, dintruna din liniile mulimii rezultat. Functia returneaz valoarea 0 sau 1. Valoarea 0 poate indica fie c expresia a fost utilizat pentru calculul valorii agregat, fie c valoarea null a expresiei este o valoare null stocat. Valoarea 1 poate indica fie c expresia nu a fost utilizat pentru calculul valorii agregat, fie c valoarea null a expresiei este o valoare creat de ROLLUP sau CUBE ca rezultat al gruprii. Exemplu:

SELECT cod_galerie, cod_artist, SUM(valoare), GROUPING(cod_galerie), GROUPING(cod_artist) FROM opera WHERE cod_galerie < 50 GROUP BY ROLLUP(cod_galerie, cod_artist); COD_GALERIE COD_ARTIST
10 10 10 40 40 50 50 60

SUM GROUPING GROUPING (VALOARE) (COD_GALERIE) (COD_ARTIST)


14000 10000 24000 8080 8080 32080 0 0 0 0 0 1 0 0 1 0 1 1

Pe prima linie din acest rezultat, valoarea totalizatoare reprezint suma valorilor operelor artistului avnd codul 50, n cadrul galeriei 10. Pentru a calcula aceast valoare au fost luate n considerare coloanele cod_galerie i cod_artist. Prin urmare, expresiile GROUPING(cod_galerie) i GROUPING(cod_artist) au valoarea 0 pentru prima linie din rezultat. Pe linia a treia se afl valoarea total a operelor din galeria avnd codul 10. Aceast valoare a fost calculat lund n considerare doar coloana cod_galerie, astfel nct GROUPING (cod_galerie) i GROUPING(cod_artist) au valorile 0, respectiv 1. Pe ultima linie din rezultat se afl valoarea total a operelor din galeriile avnd codul mai mic dect 50. Nici una dintre coloanele cod_galerie i cod_artist nu au intervenit n calculul acestui total, prin urmare valorile corespunztoare expresiilor GROUPING(cod_galerie) i GROUPING(cod_artist) sunt 0.

LMD Comanda INSERT


Prin intermediul comenzii INSERT se pot introduce nregistrri n urmtoarele obiecte sau tipuri de partiii: tabel sau tabel de baz al unei vizualizri; partiie a unui tabel partiionat; tabel obiect.

Sintaxa general a instruciunii este urmtoarea: INSERT {inserare _tabel_singular | inserare_multi_tabel};

Clauza inserare_tabel_singular permite introducerea uneia sau mai multor nregistrri ntr-un singur tabel. Sintaxa corespunztoare este urmtoarea INTO clauza_obiect [AS alias] [ (nume_coloan [, nume_coloan ] ) ] {VALUES ( {expr | DEFAULT} [, {expr | DEFAULT} ] ) [clauza_returning] | subcerere} Opiunea clauza_obiect are urmtoarea form sintactic: { [nume_schema.] {nume_tabel | {nume_vizualizare } [ @ legatura_baza_de_ date ] | (subcerere [clauza_restricionare_subcerere] ) | expresie_colecie_tabel} Sintaxa pentru clauza_restricionare_subcerere este urmtoarea: WITH {READ ONLY | CHECK OPTION} [CONSTRAINT nume_constrngere] } Opiunea clauza_returning are urmtoarea form: RETURNING expr [, expr] INTO element [, element] Sintaxa clauzei expresie_colecie_tabel este urmtoarea: TABLE (expresie_colecie) [ (+) ] Prin intermediul opiunii clauza_obiect se specific obiectele n care se introduc date. Dac se specific o vizualizare sau o vizualizare obiect, sistemul Oracle va insera liniile n tabelul de baz al acesteia. n continuare sunt menionate cteva restricii ale acestei clauze. ntr-o vizualizare care a fost creat utiliznd clauza WITH CHECK OPTION se pot introduce numai linii care sunt selectate de cererea din definiia acesteia. Prezena clauzei ORDER BY n subcererea din clauza_obiect garanteaz doar ordonarea liniilor ce vor fi inserate i numai n cadrul fiecrei extensii a tabelului. Nu se asigur ordonarea liniilor noi printre cele deja

existente. Dac o vizualizare a fost creat utiliznd un singur tabel de baz este posibil inserarea de linii, ale cror valori pot fi regsite ulterior, prin utilizarea clauzei RETURNING. ntr-o vizualizare pot fi inserate nregistrri doar prin declanatorii INSTEAD OF, dac cererea care o definete conine una din urmtoarele construcii: un operator pe mulimi, operatorul DISTINCT, o funcie agregat, clauzele GROUP BY, ORDER BY, CONNECT BY sau START WITH, o expresie colecie ntr-o list SELECT, o subcerere ntr-o list SELECT, join-uri. . Pentru tabel, vizualizare sau subcerere se poate specifica un alias. Acesta nu este permis n cadrul unei inserri multiple. Clauza VALUES specific valorile ce vor fi introduse n tabel sau vizualizare. Pentru a insera mai multe linii prin aceeai instruciune INSERT, n locul acestei clauze se va preciza o subcerere. n linia introdus, fiecrei coloane a listei din clauza INSERT INTO i se atribuie o valoare din clauza VALUES sau din subcerere. Dac se omite precizarea valorii unei coloane din list, se va considera valoarea sa implicit. Dac se introduce o linie care conine valori pentru fiecare coloan, nu este necesar precizarea listei de coloane n clauza INTO. n absena listei de coloane, clauza VALUES sau subcererea trebuie s precizeze valori pentru toate coloanele din tabel, n ordinea n care au fost definite. n ceea ce privete valorile inserate, se impun urmtoarele restricii: nu se poate iniializa un atribut intern LOB al unui obiect cu alt valoare dect empty sau null; nu poate fi inserat o valoare BFILE, dac locatorul acesteia nu a fost iniializat, fie i cu valoarea null; pentru un tabel partiionat de tip list, nu se poate introduce o valoare n coloana corespunztoare cheii de partiionare, dac aceasta nu exist deja n lista uneia dintre partiii; la inserarea ntr-o vizualizare nu este permis precizarea cuvntului cheie DEFAULT. Opiunea WITH READ ONLY indic faptul c tabelul sau vizualizarea nu pot

fi actualizate. Clauza WITH CHECK OPTION determin interzicerea modificrilor asupra tabelului sau vizualizrii care ar putea produce linii ce nu sunt incluse n subcerere. Acestei constrngeri i se poate atribui un nume prin intermediul opiunii CONSTRAINT. n absena acesteia, sistemul i va atribui automat un nume de forma SYS_Cn, unde n este un numr ntreg ce asigur unicitatea identificatorului n cadrul bazei de date. Opiunea legtur_baz_de_date specific un nume complet sau parial al unei legturi ctre o baz de date distant, n care se afl tabelul sau vizualizarea. n absena acestei clauze, se presupune c tabelul sau vizualizarea se afl n baza de date local. Clauza expresie_colecie_tabel determin tratarea valorii din expresie_colecie ca un tabel, n cadrul cererilor i operaiilor LMD. n expresie_colecie poate fi specificat o subcerere, o coloan, o funcie sau un constructor de colecie. Indiferent de forma sa, aceasta trebuie s returneze o valoare colecie, adic o valoare de tip tablou imbricat sau vector. Procesul de extragere al elementelor unei colecii este numit distribuirea coleciilor. Clauza RETURNING recupereaz liniile afectate de o instruciune LMD. Aceast clauz poate fi specificat pentru tabele i vizualizri avnd un singur tabel de baz. Atunci cnd opereaz asupra unei singure linii, o instruciune LMD ce conine clauza RETURNING poate recupera valori ale coloanelor, valori ROWID i valori referin corespunztoare liniei afectate. Aceste valori pot fi stocate n variabile gazd sau variabile PL/SQL. Instruciunile LMD care opereaz asupra mai multor linii pot recupera aceste valori n tablouri de legtur (bind array). n expr poate fi specificat orice expresie valid, cu excepia expresiilor de tip subcerere scalar. Opiunea INTO indic faptul c valorile liniilor modificate urmeaz s fie stocate n variabilele specificate. Fiecare element din clauz este o variabil gazd sau PL/SQL care stocheaz o valoare recuperat (expr). Fiecrei expresii din lista RETURNING trebuie s i se asocizeze n lista INTO o variabil gazd sau PL/SQL, compatibil din punct de vedere al tipului de date. Clauza RETURNING nu poate fi specificat pentru inserri multitabel, operaii LMD paralele, recuperarea tipurilor LONG sau vizualizri asupra crora a fost definit un declanator de tip INSTEAD OF. Subcererea specificat n comanda INSERT returneaz linii care vor fi adugate n tabel. Dac n tabel se introduc linii prin intermediul unei subcereri, coloanele din lista SELECT trebuie s corespund, ca numr i tip, celor precizate n clauza INTO. n absena unei liste de coloane n clauza INTO, subcererea trebuie s furnizeze valori pentru fiecare atribut al obiectului destinaie, respectnd ordinea n care acestea au fost definite. Observaii:

Pentru claritate, este recomandat utilizarea unei liste de coloane n clauza INSERT. n clauza VALUES, valorile de tip caracter i dat calendaristic trebuie incluse ntre apostrofuri. Nu se recomand includerea ntre apostrofuri a valorilor numerice, ntruct aceasta ar determina conversii implicite la tipul NUMBER. Pentru introducerea de valori speciale n tabel, pot fi utilizate funcii. Adugarea unei linii care va conine valori null se poate realiza n mod: implicit, prin omiterea numelui coloanei din lista de coloane; explicit, prin specificarea n lista de valori a cuvntului cheie null sau a irului vid n cazul irurilor de caractere sau datelor calendaristice. Exemplu: S se adauge prin metoda explicit, respectiv prin metoda implicit, dou nregistrri n tabelul artist, preciznd numai codul, numele i prenumele artistului. INSERT INTO artist(cod_artist, nume, prenume) VALUES (50, 'Grigorescu', 'Nicolae'); INSERT INTO artist VALUES (70, 'Andreescu', 'Ion', NULL, NULL, NULL, NULL); Exemplu: INSERT INTO opera (cod_opera, tip, titlu, cod_artist, data_achizitiei, cod_galerie, material) VALUES (110, 'sculptura', 'Rugaciune', 60, TO_DATE('20 JAN, 1997', 'DD MON, YYYY'), cod_galerie_secv.CURRVAL, 'bronz'); Server-ul Oracle aplic automat toate tipurile de date, domeniile de valori i constrngerile de integritate. La introducerea sau actualizarea de nregistrri, pot aprea erori n urmtoarele situaii: nu a fost specificat o valoare pentru o coloan NOT NULL; exist valori duplicat care ncalc o constrngere de unicitate; a fost nclcat constrngerea de cheie extern sau o constrngere de tip CHECK; exist incompatibilitate n privina tipurilor de date;

s-a ncercat inserarea unei valori avnd o dimensiune mai mare dect a coloanei corespunztoare. Exemplu: Urmtoarea instruciune va genera eroarea ORA-01400: cannot insert NULL into , ntruct se ncearc inserarea unei linii n tabelul opera fr a preciza valoarea cheii primare. INSERT INTO opera(titlu, data_achizitiei) VALUES ('Flori de camp', SYSDATE); Exemplu: Se presupune c exist un tabel opera_3000 care are aceeai structur ca i tabelul opera. S se insereze n acest tabel codul i titlul operelor a cror valoare, incluznd poliele de asigurare, depete 3000. INSERT INTO opera_3000(cod_opera, titlu) SELECT cod_opera, titlu FROM opera o, (SELECT cod_opera, sum(valoare) val_polite FROM polita_asig GROUP BY cod_opera) x WHERE x.cod_opera = o.cod_opera AND o.valoare + x.val_polite > 3000; Exemplu: INSERT INTO domeniu VALUES ('&cod', '&intdom');-- inserare prin parametrizare Exemplu: S se introduc o nregistrare n tabelul opera. Presupunnd c au fost declarate variabilele de legtur bind1 i bind2, s se returneze valoarea operei mrit cu 20% i codul acesteia. INSERT INTO opera (cod_opera, titlu, cod_autor, valoare, data_achizitiei) VALUES (178, 'Abis', 80, 4500, SYSDATE) RETURNING valoare*1.20, cod_opera INTO :bind1, :bind2;

Inserri multitabel
O inserare multitabel presupune introducerea de linii calculate pe baza

rezultatelor unei subcereri, n unul sau mai multe tabele. Acest tip de inserare, introdus de Oracle9i, este util n mediul data warehouse. Astfel, datele extrase dintr-un sistem surs, pot fi transformate utiliznd instruciuni INSERT multitabel, spre a fi ncrcate n obiectele bazei de date. Pentru o astfel de inserare, n versiunile anterioare lui Oracle9i erau necesare n operaii independente INSERT INTOSELECT, unde n reprezint numrul tabelelor destinaie. Aceasta presupunea n procesri ale aceleiai surse de date i, prin urmare, creterea de n ori a timpului necesar procesului. Sintaxa clauzei inserare_multi_tabel este urmtoarea: {ALL INTO[VALUES] [INTO[VALUES] ] | inserare_condiionat} subcerere Clauza inserare_condiionat are forma urmtoare: [ALL | FIRST] WHEN condiie THEN INTO[VALUES] [INTO[VALUES] ] [WHEN condiie THEN INTO[VALUES] [INTO[VALUES] ] ] [ELSE INTO[VALUES] [INTO[VALUES] ] ] Pentru a efectua o inserare multitabel necondiionat, sistemul va executa cte o instruciune INSERTINTO pentru fiecare linie returnat de subcerere. Utiliznd clauza inserare_condiionat, decizia inserrii unei linii depinde de condiia specificat prin intermediul opiunii WHEN. Expresiile prezente n aceste condiii trebuie s fac referin la coloane returnate de subcerere. O instruciune de inserare multitabel poate conine maxim 127 clauze WHEN. Specificarea opiunii ALL determin evaluarea tuturor condiiilor din clauzele WHEN. Pentru cele a cror valoare este TRUE, se insereaz nregistrarea specificat n opiunea INTO corespunztoare. Opiunea FIRST determin inserarea corespunztoare primei clauze WHEN a crei condiie este evaluat TRUE. Toate celelalte clauze WHEN sunt ignorate. Dac nici o condiie din clauzele WHEN nu este TRUE, atunci sistemul execut clauza INTO corespunztoare opiunii ELSE, iar dac aceasta nu exist, nu efectueaz nici o aciune.

Inserrile multitabel pot fi efectuate numai asupra tabelelor, nu i asupra vizualizrilor sau vizualizrilor materializate. De asemenea, acest tip de inserare nu se poate efectua asupra tabelelor distante. Subcererea dintr-o instruciune corespunztoare unei inserri multitabel nu poate utiliza o secven. Exemplu: Se presupune c licitaiile pentru achiziionarea operelor de art au loc numai n zilele de miercuri. Fie tabelul opera_intrare (data_inceput, sapt_1, sapt_2, sapt_3, sapt_4), n care data_inceput reprezint data primei zile de miercuri din lun, iar sapt_i furnizeaz valoarea operelor achiziionate n sptmna respectiv. Considernd c n fiecare sptmn se achiziioneaz o singur lucrare, s se insereze liniile corespunztoare n tabelul opera. INSERT ALL INTO opera (cod_opera, valoare, data_achizitiei) VALUES (secv_cod_opera.NEXT_VALUE, sapt_1, data_inceput) INTO opera (cod_opera, valoare, data_achizitiei) VALUES (secv_cod_opera.NEXT_VALUE, sapt_2, data_inceput + 7) INTO opera (cod_opera, valoare, data_achizitiei) VALUES (secv_cod_opera.NEXT_VALUE, sapt_3, data_inceput + 14) INTO opera (cod_opera, valoare, data_achizitiei) VALUES (secv_cod_opera.NEXT_VALUE, sapt_4, data_inceput + 21) SELECT data_inceput, sapt_1, sapt_2, sapt_3, sapt_4 FROM opera_intrare; Exemplu: Se consider trei tabele care conin informaii referitoare la galerii, n funcie de numrul operelor gzduite de ctre acestea. Tabelele se numesc galerie_mica, galerie_medie, galerie_mare dup cum numrul de opere este mai mic dect 30, cuprins ntre 31 i 100, respectiv mai mare dect 101. Se presupune c structura fiecruia dintre tabele este alctuit din coloanele cod_galerie, nume, numr_opere. S se insereze nregistrri n aceste tabele. INSERT ALL WHEN nr_opere <= 30 THEN INTO galerie_mica WHEN nr_opere > 30 AND nr_opere <= 100 THEN INTO galerie_medie WHEN nr_opere > 100 THEN INTO galerie_mare SELECT g.cod_galerie, nume_galerie, nr_opere FROM galerie g, (SELECT cod_galerie, count(*) nr_opere FROM opera

GROUP BY cod_galerie) x WHERE g.cod_galerie = x.cod_galerie;

Comanda UPDATE
Pentru modificarea valorilor existente ntr-un tabel sau ntr-un tabel de baz al unei vizualizri, se utilizeaz comanda UPDATE, care are urmtoarea sintax general: UPDATE {clauza_obiect } [AS alias] SET { { (nume_coloan [, nume_coloan] ) = (subcerere) | nume_coloan = {expr | (subcerere) | DEFAULT} } [, { ( nume_coloan [, nume_coloan ] ) = (subcerere) | nume_coloan = {expr | (subcerere) | DEFAULT} } ]} [WHERE condiie] [clauza_returning]; Sintaxa i semnificaia opiunilor clauza_obiect, alias, clauza_returning au fost prezentate explicit n cadrul comenzii INSERT. . Prin nume_coloan se precizeaz coloanele ale cror valori vor fi modificate. Valorile coloanelor care nu apar n aceast list rmn nemodificate. O coloan care se refer la un atribut al unui obiect LOB va trebui iniializat empty sau null. Subcererea trebuie s returneze cte o linie pentru fiecare nregistrare actualizat. De asemenea, numrul i tipul coloanelor returnate de subcerere trebuie s corespund cu cel al coloanelor actualizate. Dac subcererea nu returneaz nici o linie, atunci coloanei respective i se va atribui valoarea null. Dac se modific o singur linie, este recomandat utilizarea valorii cheii primare pentru a identifica nregistrarea supus actualizrii. n absena clauzei WHERE, sunt modificate toate liniile din tabel. Exemplu: a) S se transfere n galeria 10 opera avnd codul 110. UPDATE opera SET cod_galerie = 10 WHERE cod_opera = 110;

b) S se modifice informaiile referitoare la opera avnd codul 120, considernd c se afl expus n aceeai galerie i a fost achiziionat la aceeai dat ca i opera al crei cod este 110. UPDATE opera SET (cod_galerie, data_achizitiei) = (SELECT cod_galerie, data_achizitiei FROM opera WHERE cod_opera = 110) WHERE cod_opera = 120; c) S se modifice copie_opera pe baza valorilor din tabelul opera. Se consider c operele care au acelai autor ca i opera avnd codul 100 sunt expuse n galeria ce conine lucrarea al crei cod este 110. UPDATE copie_opera SET cod_galerie = (SELECT cod_galerie FROM opera WHERE cod_opera = 110) WHERE cod_autor = (SELECT cod_autor FROM opera WHERE cod_opera = 100); Cazurile n care instruciunea UPDATE nu poate fi executat sunt similare celor n care eueaz instruciunea INSERT. Acestea au fost menionate anterior. Exemplu: UPDATE opera SET cod_galerie = 47 WHERE cod_galerie = 40; Deoarece galeria avnd codul 47 nu exist n tabelul printe (galerie), instruciunea precedent va genera eroarea ORA-02291: integrity constraint (STUDENT.SYS_C002773) violated - parent key not found. Exemplu: S se transfere n galeria avnd codul 50 toate operele din galeria 60, care sunt create de Nicolae Grigorescu. S se mreasc cu 10% valoarea acestor opere. UPDATE opera o SET cod_galerie = 50, valoare = valoare * 1.10 WHERE (SELECT INITCAP(nume) ||' '||INITCAP(prenume) FROM artist

WHERE cod_artist = o.cod_artist)= 'Nicolae Grigorescu' AND o.cod_galerie = 60; Exemplu: S se actualizeze operele al cror autor este tefan Luchian astfel: codul galeriei devine codul galeriei n care este expus cea mai scump oper a artistului, valoarea fiecrei opere va fi mrit cu 10% din media valorilor operelor din galerie, iar data achiziiei va fi considerat data celei mai recente achiziii din galerie. UPDATE opera o SET cod_galerie = (SELECT cod_galerie FROM artist a, opera b WHERE a.cod_artist = b.cod_artist AND INITCAP(nume) = 'Luchian ' AND INITCAP(prenume) = 'Stefan' AND valoare = (SELECT MAX(valoare) FROM opera WHERE cod_artist = b.cod_artist)), (valoare, data_achizitiei) = (SELECT o.valoare + AVG(o2.valoare)*0.10, MAX(o2.data_achizitiei) FROM opera o2 WHERE o.cod_opera = o2.cod_opera) WHERE cod_artist = (SELECT cod_artist FROM artist WHERE INITCAP(nume) = 'Luchian ' AND INITCAP(prenume) = 'Stefan'); Exemplu: S se mreasc cu 1000 valoarea operei avnd codul 100 i s se returneze titlul, codul artistului i vechea valoare n variabilele de legtur bind1, bind2, respectiv bind3. UPDATE opera SET valoare = valoare + 1000 WHERE cod_opera = 100 RETURNING titlu, cod_artist, valoare 1000 INTO :bind1, :bind2, :bind3;

Oracle9i introduce o nou funcionalitate, reprezentat de posibilitatea utilizrii valorilor implicite (DEFAULT) n instruciunile INSERT i UPDATE. Unei coloane i se atribuie valoarea implicit definit la crearea sau modificarea structurii tabelului dac: nu se precizeaz nici o valoare; se precizeaz cuvntul cheie DEFAULT n comenzile INSERT sau UPDATE. Dac nu a fost definit nici o valoare implicit pentru coloana respectiv, sistemul i atribuie valoarea null. Cuvntul cheie DEFAULT nu poate fi specificat la actualizarea vizualizrilor. Exemplu: S se creeze tabelul test, avnd o coloan creia i se specific o valoare implicit. Ulterior, s se modifice aceast valoare. S se insereze i s se actualizeze cte o nregistrare din tabel, utiliznd valoarea implicit. CREATE TABLE test( cod NUMBER PRIMARY KEY, nume VARCHAR2(30) DEFAULT 'NECUNOSCUT'); ALTER TABLE test MODIFY (nume DEFAULT 'NEDEFINIT'); INSERT INTO test VALUES (1, DEFAULT); UPDATE test SET nume = DEFAULT WHERE cod = 2;

Comanda DELETE tergerea unor linii dintr-un tabel (simplu, partiionat sau tabel de baz al unei vizualizri) se realizeaz prin intermediul comenzii DELETE, care are urmtoarea sintax: DELETE [FROM] {clauza_obiect } [AS alias] [WHERE condiie] [clauza_returning]; Sintaxa i semnificaia clauzelor care sunt prezente n instruciunea DELETE

sunt similare celor expuse n cadrul instruciunii INSERT. Clauza WHERE determin tergerea liniilor identificate prin condiia respectiv. n absena clauzei WHERE sunt terse toate liniile din tabel. Pentru a terge linii identificate cu ajutorul valorilor din alte tabele, se utilizeaz subcereri. Exemplu: a) S se suprime nregistrarea corespunztoare operei avnd codul 120. DELETE FROM opera WHERE cod_opera = 120; Urmtoarea instruciune are acelai efect, dar utilizeaz o subcerere: DELETE FROM (SELECT * FROM opera) WHERE cod_opera = 120; b) S se tearg ntregul coninut al tabelului copie_opera. DELETE FROM copie_opera; c) S se tearg toate operele care se afl expuse ntr-o galerie al crei nume conine irul de caractere FLOARE. DELETE FROM opera WHERE cod_galerie = (SELECT cod_galerie FROM galerie WHERE UPPER(nume_galerie) LIKE '% FLOARE %'); Dac se ncearc tergerea unei nregistrri care conine o valoare implicat ntr-o constrngere de integritate, atunci va fi returnat o eroare. Exemplu: DELETE FROM galerie WHERE cod_galerie = 40; n urma execuiei acestei instruciuni sistemul genereaz eroarea ORA02292: integrity constraint (STUDENT.SYS_C002773) violated - child record found, datorat calitii de cheie extern a coloanei cod_galerie n tabelul opera. Exist opere n galeria avnd codul 40 i de aceea aceasta nu poate fi suprimat. n cazul n care constrngerea de integritate referenial a fost definit utiliznd opiunea ON DELETE CASCADE, atunci instruciunea DELETE va terge att liniile indicate, ct i liniile copil din tabelele corespunztoare. Exemplu:

S se tearg ultima oper de art achiziionat. S se rein valoarea acesteia ntr-o variabil de legtur. DELETE FROM opera WHERE data_achizitiei = (SELECT MAX(data_achizitiei) FROM opera) RETURNING valoare INTO :bind1; Exemplu: S se tearg cartea cea mai scump i s se rein valoarea acesteia ntr-o variabil de legtur.
DELETE WHERE FROM carte pret = (SELECT MAX(pret) FROM carte RETURNING pret INTO :aaa;

Utilizarea subcererilor n instruciunile LMD n exemplele prezentate anterior se observ c subcererile pot fi utilizate pentru furnizarea valorilor care identific liniile afectate de o instruciune LMD. n continuare, vor fi prezentate i alte situaii n care subcererile pot fi folosite n instruciuni LMD. O subcerere poate fi folosit pentru a identifica tabelul i coloanele referite de o instruciune LMD. De exemplu, subcererile pot fi folosite n locul numelui tabelului din clauza INTO a instruciunii INSERT. Lista SELECT a acestei subcereri trebuie s conin acelai numr de coloane ca i lista corespunztoare clauzei VALUES. Pentru ca instruciunea INSERT s fie executat cu succes, trebuie s fie respectate toate regulile impuse asupra coloanelor tabelului de baz. Astfel, nu se poate specifica o valoare duplicat pentru cheia primar i nu se poate lsa neprecizat valoarea unei coloane avnd constrngerea NOT NULL. Exemplu: INSERT INTO (SELECT cod_opera, titlu, data_achizitiei, valoare, cod_galerie FROM opera WHERE cod_galerie = 40) VALUES (150, 'Intelepciunea Pamantului', TO_DATE('10-JUL-80', 'DD-MON-RR'), 10000, 40); Specificarea opiunii WITH CHECK OPTION ntr-o subcerere utilizat n

locul tabelului corespunztor unei instruciuni LMD are ca efect interzicerea operaiilor care produc linii ce nu vor fi incluse n rezultatul subcererii. Exemplu: INSERT INTO (SELECT cod_opera, titlu, data_achizitiei, valoare FROM opera WHERE cod_galerie = 40 WITH CHECK OPTION) VALUES (160, 'Portretul unei femei', TO_DATE('26-MAR-82', 'DD-MON-RR'),15000); Subcererea din exemplul anterior identific operele expuse n galeria avnd codul 40. ntruct coloana cod_galerie nu se afl n lista SELECT, nu se precizeaz nici o valoare a acesteia pentru linia introdus. Aceasta nseamn c noua nregistrare ar avea valoarea null pentru coloana cod_galerie i, prin urmare, nu ar aprea n rezultatul subcererii. Execuia instruciunii determin generarea erorii ORA-01402: view WITH CHECK OPTION where-clause violation.

LIMBAJUL PENTRU CONTROLUL DATELOR


Controlul unei baze de date cu ajutorul SQL-ului se refera la: asigurarea confidentialitatii si securitatii datelor; organizarea fizica a datelor; realizarea unor performante; reluarea unor actiuni in cazul unei defectiuni; garantarea coerentei datelor in cazul prelucrarii concurente. Sistemul de gestiune trebuie: s pun la dispoziia unui numr mare de utilizatori o mulime coerent de date; s garanteze coerena datelor n cazul manipulrii simultane de ctre diferii utilizatori. Coerena este asigurat cu ajutorul conceptului de tranzacie. Tranzacia este unitatea logic de lucru constnd din una sau mai multe instruciuni SQL, care trebuie s fie executate atomic (ori se execut toate, ori nu

se execut nici una!), asigurnd astfel trecerea BD dintr-o stare coerent n alt stare coerent. Dac toate operaiile ce constituie tranzacia sunt executate i devin efective, spunem c tranzacia este validat, iar modificrile aduse de tranzacie devin definitive. Controlul tranzaciilor se realizeaz prin utilizarea instruciunilor limbajului de control al datelor: COMMIT, ROLLBACK, SET TRANSACTION, SAVEPOINT. Tranzaciile pot fi de tip LMD, LDD sau LCD. Tranzaciile LDD i LCD constau dintr-o singur instruciune LDD, respectiv LCD. Tranzaciile LMD constau dintr-o succesiune de instruciuni LMD care determin o modificare consistent a datelor. De exemplu, un transfer de fonduri ntre dou conturi bancare presupune debitarea unui cont i creditarea celuilalt cu aceeai sum. Ambele aciuni trebuie fie s eueze, fie s se ncheie cu succes. Creditarea nu trebuie salvat fr s fie salvat i operaia de debitare. Deci o tranzacie const: dintr-o singur instruciune LDD; dintr-o singur instruciune LCD; din instruciuni LMD care fac schimbri consistente n date. Procesarea tranzaciilor Modificrile fcute asupra datelor n timpul unei tranzacii sunt temporare pn cnd tranzacia este salvat. Operaiile de prelucrare a datelor afecteaz iniial un buffer al bazei. Prin urmare, starea precedent a datelor poate fi recuperat. Tranzacia ncepe: cnd este executat prima instruciune LMD SQL. dup o comand COMMIT, dup o comand ROLLBACK, dup conectarea iniial la Oracle, i se termin la: apariia unei instruciuni LDD; emiterea unei instruciuni LCD; prsirea mediului SQL*Plus; defectarea staiei de lucru sau la nregistrarea unei ntreruperi a sistemului.

Dup ce se termin o tranzacie, prima instruciune SQL executabil va genera automat nceputul unei noi tranzacii. Execuia unei instruciuni LDD determin salvarea automat a modificrilor survenite pe perioada tranzaciei. Server-ul Oracle genereaz o operaie COMMIT implicit nainte i dup orice instruciune LDD. Aadar, chiar dac instruciunea LDD nu este executat cu succes, instruciunea anterioar acesteia nu mai poate fi anulat ntruct server-ul a efectuat deja operaia COMMIT. Instruciunile COMMIT i ROLLBACK ncheie tranzacia curent prin definitivarea, respectiv anularea tuturor modificrilor aflate n ateptare. Aceste instruciuni permit: asigurarea consistenei datelor; previzualizarea modificrilor asupra datelor nainte ca acestea s devin permanente; gruparea logic a operaiilor. Ieirea din mediul SQL*Plus fr lansarea unei instruciuni COMMIT sau ROLLBACK are ca efect salvarea automat a tranzaciei curente. Atunci cnd intervine o anomalie (cdere) a sistemului sau nchiderea anormal a sesiunii SQL*Plus, ntreaga tranzacie curent este anulat automat (ROLLBACK). Acest fapt mpiedic eroarea s cauzeze modificri nedorite ale datelor i determin revenirea la starea din momentul ultimei operaii COMMIT. O ieire normal din iSQL*Plus are loc prin apsarea butonului Exit. Terminarea normal a unei sesiuni SQL*Plus are loc prin execuia comenzii EXIT. n SQL*Plus, nchiderea ferestrei este interpretat ca ieire anormal. Interfaa SQL*Plus pune la dispoziie variabila de mediu AUTOCOMMIT, care poate avea valorile ON sau OFF. Dac aceast variabil are valoarea ON, atunci efectul fiecrei instruciuni LMD se definitiveaz imediat ce instruciunea a fost executat. Dac variabila AUTOCOMMIT are valoarea OFF, definitivarea unei tranzacii va avea loc la execuia comenzii COMMIT sau n cazurile de salvare automat a tranzaciilor, prezentate anterior. Dup ncheierea unei tranzacii, urmtoarea instruciune SQL executabil marcheaz automat nceputul unei noi tranzacii. Comanda COMMIT Instruciunea COMMIT determin ncheierea tranzaciei curente i permanentizarea modificrilor care au intervenit pe parcursul acesteia. Instruciunea suprim toate punctele intermediare definite n tranzacie i elibereaz blocrile tranzaciei. De asemenea, instruciunea poate fi utilizat pentru

terminarea unei tranzacii read-only nceput printr-o comand SET TRANSACTION. Sistemul lanseaz implicit o comand COMMIT nainte i dup orice instruciune LDD. Sintaxa corespunztoare comenzii COMMIT este urmtoarea: COMMIT [WORK] [COMMENT 'text' | FORCE 'text' [, nr_ntreg] ]; Opiunea WORK a fost introdus din motive de conformitate cu standardul SQL. Instruciunile COMMIT i COMMIT WORK sunt echivalente. Clauza COMMENT permite specificarea unui comentariu care va fi asociat tranzaciei curente. Textul care i urmeaz poate ocupa maxim 255 octei i va fi stocat n vizualizarea DBA_2PC_PENDING din dicionarul datelor. ntr-un sistem distribuit, clauza FORCE permite salvarea manual a unei tranzacii distribuite in-doubt (n care operaia COMMIT a fost ntrerupt de o cdere a sistemului sau a reelei). Textul care i urmeaz conine identificatorul local sau global al tranzaciei. Pentru a afla aceti identificatori se poate consulta, de asemenea, vizualizarea DBA_2PC_PENDING din dicionarul datelor. O instruciune COMMIT care conine clauza FORCE permanentizeaz numai tranzacia specificat i nu o afecteaz pe cea curent. Prezena acestei clauze nu este permis n PL/SQL. Exemplu: S se insereze o nregistrare n tabelul artist i s se permanentizeze modificarea. INSERT INTO artist(cod_artist, nume, prenume) VALUES (189, 'Pallady', 'Theodor'); COMMIT; nainte de operaia COMMIT, utilizatorul curent poate vizualiza rezultatele comenzilor LMD prin interogarea tabelelor. Efectele acestor operaii nu sunt vizibile celorlali utilizatori. Server-ul Oracle asigur consistena la citire, astfel nct fiecare utilizator vizualizeaz datele n starea corespunztoare ultimei operaii COMMIT efectuate asupra lor. Liniile afectate de tranzacia curent sunt blocate, nefiind posibil modificarea lor de ctre ceilali utilizatori. Dac mai muli utilizatori modific simultan acelai tabel, fiecare dintre acetia poate consulta numai propriile modificri. Pe msur ce operaia COMMIT este executat de ctre utilizatori, actualizrile efectuate de acetia devin vizibile. n urma execuiei instruciunii COMMIT, modificrile asupra datelor sunt scrise n baza de date, iar starea precedent a datelor este pierdut definitiv. n

acest fel, rezultatele tranzaciei pot fi vizualizate de ctre toi utilizatorii. Blocrile asupra liniilor afectate sunt eliberate, astfel c nregistrrile devin disponibile celorlali utilizatori pentru a efectua noi actualizri. Dup operaia COMMIT, toate punctele intermediare (SAVEPOINT) ale tranzaciei respective sunt terse. Comanda ROLLBACK Atunci cnd o linie este modificat, valorile anterioare ale coloanelor actualizate sunt salvate ntr-un segment de reluare. Dac tranzacia este anulat, server-ul Oracle va rescrie valorile din acest segment n linia tabelului. Pentru a renuna la modificrile efectuate se utilizeaz instruciunea ROLLBACK. n urma execuiei acesteia, se ncheie tranzacia, se anuleaz modificrile asupra datelor, se restaureaz starea lor precedent i se elibereaz blocrile asupra liniilor. O parte a tranzaciei poate fi anulat automat printr-o operaie ROLLBACK implicit dac a fost detectat o eroare n timpul execuiei unei instruciuni. Dac o singur instruciune LMD eueaz n timpul execuiei unei tranzacii, efectul su este anulat de un ROLLBACK la nivel de instruciune, dar schimbrile efectuate de instruciunile LMD precedente nu sunt anulate. Acestea din urm pot fi salvate sau anulate explicit de ctre utilizator. Sintaxa instruciunii ROLLBACK este urmtoarea: ROLLBACK [WORK] [TO [SAVEPOINT] pct_intermediar | FORCE 'text']; Semnificaiile opiunilor WORK i FORCE sunt similare celor prezentate n cadrul instruciunii COMMIT. n clauza TO SAVEPOINT se poate specifica punctul intermediar pn la care se dorete anularea tranzaciei. n absena acestei clauze, ntreaga tranzacie este anulat. O tranzacie in-doubt nu poate fi anulat manual pn la un punct intermediar. Dac a fost definit un punct intermediar prin instruciunea SAVEPOINT nume, instruciunea ROLLBACK TO SAVEPOINT nume determin ntoarcerea tranzaciei curente la punctul intermediar specificat. n felul acesta se revine ntr-o stare anterioar a tranzaciei i se anuleaz modificrile care au survenit dup definirea punctului intermediar. De asemenea, sunt terse punctele intermediare ulterioare acestuia i sunt eliberate toate blocrile asupra tabelelor sau liniilor, efectuate dup punctul intermediar respectiv. Comanda SAVEPOINT

Instruciunea SAVEPOINT marcheaz un punct intermediar n procesarea tranzaciei. n acest mod este posibil mprirea tranzaciei n subtranzacii. Aceast instruciune nu face parte din standardul ANSI al limbajului SQL. Punctele intermediare definite n procesarea unei tranzacii nu sunt obiecte ale schemei i nu pot fi referite n dicionarul datelor. Nu exist nici o modalitate de a lista punctele intermediare definite. Dac este creat un al doilea punct intermediar avnd acelai nume cu un punct intermediar precedent, acesta din urm este ters. Instruciunea SAVEPOINT are sintaxa: SAVEPOINT nume_pct_intermediar; Exemplu: S se mreasc prin 20%, respectiv 50% valoarea operelor care au codurile 100, respectiv 150. S se verifice c valoarea total a operelor din galerie nu depete 7 000 000, iar apoi s se reactualizeze valoarea operei avnd codul 150, mrind-o cu 40%. UPDATE opera SET valoare = valoare * 1.2 WHERE cod_opera = 100; SAVEPOINT val_100; UPDATE opera SET valoare = valoare * 1.5 WHERE cod_opera = 150; SAVEPOINT val_150; SELECT SUM(valoare) FROM opera; ROLLBACK TO SAVEPOINT val_100; UPDATE opera SET valoare = valoare * 1.4 WHERE cod_opera = 150; COMMIT;

INTERFATA SQL*PLUS
SQL este un limbaj compus din comenzi care permit comunicarea cu server-ul Oracle, din orice utilitar sau aplicaie. SQL*Plus este un utilitar Oracle, avnd comenzi proprii specifice, care recunoate instruciunile SQL i le trimite server-ului Oracle pentru execuie. Oracle9i a introdus interfaa iSQL*Plus, la SQL*Plus. Aceasta se bazeaz pe un browser Web, prin intermediul cruia este permis conectarea la sistemul Oracle9i i efectuarea aciunilor care sunt posibile prin SQL*Plus, cu unele excepii. Din iSQL*Plus, pot fi lansate comenzi SQL*Plus, SQL i PL/SQL. Dintre funcionalitile mediului SQL*Plus, se pot enumera: editarea, executarea, salvarea i regsirea instruciunilor SQL i a blocurilor PL/SQL; calculul, stocarea i afiarea rezultatelor furnizate de cereri; listarea structurii tabelelor; accesarea i copierea de informaii dintr-o baz de date n alta; administrarea bazei de date. Variabile de substituie O variabil de substituie este definit de utilizator. O comand n care apare o variabil de substituie va fi executat de SQL*Plus ca i cum ar conine o valoare efectiv. Variabilele de substituie pot fi utilizate oriunde n comenzile SQL i SQL*Plus, dar nu pot aprea ca prim cuvnt la prompt-ul de comand. Cnd SQL*Plus ntlnete ntr-o comand o variabil de substituie nedefinit, va solicita utilizatorului introducerea unei valori. Aceasta poate fi orice ir de caractere i poate conine blank-uri sau semne de punctuaie. Dac variabila este de tip caracter i nu a fost inclus ntre apostrofuri n comanda SQL, utilizatorul va trebui s includ ntre apostrofuri valoarea introdus. SQL*Plus citete de la tastatur valoarea introdus i listeaz forma liniei ce conine variabila de substituie, nainte i dup nlocuirea valorii introduse. Aceast listare poate fi suprimat prin comanda SET VERIFY OFF. Dac valoarea furnizat unei variabile de substituie coincide cu numele altei variabile, atunci coninutul acesteia va fi utilizat n locul valorii respective. Dac o variabil de substituie apare de mai multe ori ntr-o comand i este precedat de un singur caracter &, valoarea ei va fi solicitat utilizatorului de tot attea ori. Pentru a evita acest lucru, se vor utiliza dou caractere & n faa variabilelor de substituie. SQL*Plus definete automat (ca i cnd ar fi folosit comanda DEFINE) variabilele de substituie precedate de &&, dar nu i pe cele precedate de &. Dac var este o variabil definit prin comanda DEFINE, atunci

SQL*Plus folosete valoarea acesteia n locul fiecrei variabile de substituie care face referin la var fie c este precedat de &, fie de &&. SQL*Plus nu va mai solicita valoarea lui var n sesiunea curent, pn la execuia unei comenzi UNDEFINE var. Variabilele de substituie nu pot fi folosite n comenzile de editare a buffer-ului (APPEND, CHANGE, DEL i INPUT). Aceste comenzi trateaz textul care ncepe cu simbolul & sau && ca pe un ir de caractere.

Caracteristici ale mediului SQL*Plus


SQL*Plus stocheaz ultima comand SQL sau ultimul bloc PL/SQL introdus ntr-o zon de memorie numit buffer SQL. Coninutul buffer-ului SQL se schimb la introducerea urmtoarei comenzi SQL sau bloc PL/SQL. n buffer-ul SQL, nu se stocheaz caracterele ; i / utilizate pentru execuia unei comenzi. Comenzile SQL*Plus nu sunt pstrate n buffer-ul SQL. Activarea interfeei SQL*Plus 1. Din WINDOWS: Se selecteaza: START > PROGRAMS > ORACLE > APPLICATION DEVELOPMENT > SQL*Plus Se da username, password si numele bazei. 2. Prin linia de comanda: SQLPLUS [nume_utiliz/parola][@nume_baza_de_date] [@nume_fisier]

Conexiune la SQL*Plus
Dup ce utilizatorul se conecteaz la SQL*Plus, sistemul afieaz un prompt (SQL>) i ateapt comenzile utilizatorului. Utilizatorul poate da: comenzi SQL pentru accesarea bazei de date; blocuri PL/SQL pentru accesarea bazei de date; comenzi SQL*Plus. Dup ce utilizatorul se conecteaz la SQL*Plus, sistemul afieaz un prompt (SQL>) i ateapt comenzile utilizatorului. Utilizatorul poate da: comenzi SQL pentru accesarea bazei de date; blocuri PL/SQL pentru accesarea bazei de date

nchiderea sesiunii de lucru SQL*Plus i preluarea controlului sistemului de operare al calculatorului gazd se realizeaz cu QUIT sau EXIT. Tabelul urmtor evideniaz diferenele dintre instruciunile SQL i cele SQL*Plus:
SQL Este un limbaj de comunicare cu server-ul Oracle pentru accesarea datelor. SQL*Plus Este un utilitar care recunoate instruciunile SQL i le transfer server-ului Oracle.

Se bazeaz pe standardul ANSI pentru Este o interfa specific sistemului Oracle pentru SQL. execuia instruciunilor SQL. SQL*Plus stocheaz ultima comand SQL sau ultimul bloc PL/SQL introdus ntr-o zon de memorie numit buffer SQL Prelucreaz date i definete obiecte din baza de date. Nu are un caracter de continuare. Instruciunile nu pot fi abreviate. Utilizeaz funcii pentru a efectua formatri. Comenzile SQL*Plus nu sunt depuse n buffer-ul SQL; Nu permite prelucrarea informaiilor din baza de date. Accept drept caracter de continuare pentru comenzile scrise pe mai multe linii. Comenzile pot fi abreviate. Utilizeaz comenzi pentru formatarea datelor.

Pentru a personaliza mediul SQL*Plus (de exemplu, ora curent s apar ca parte a prompt-ului de comand) i a pstra, n sesiunile viitoare, caracteristicile stabilite, se utilizeaz un fiier al sistemului de operare gazd, numit login.sql. n acesta, pot fi adugate instruciuni SQL, comenzi SQL*Plus sau blocuri PL/SQL. La pornirea utilitarului SQL*Plus, sunt rulate automat comenzile din acest fiier.

Setri n SQL*Plus
Comanda care permite controlul sesiunii SQL*Plus este SET. Efectul acesteia se pstreaz pn la sfritul sesiunii n care a fost executat. Pentru a pstra unele setri, comanda trebuie adugat n fiierul login.sql. Sintaxa generic a acestei comenzi este: SET variabila_sistem valoare Componenta variabila_sistem controleaz un aspect al mediului n care se desfoar sesiunea.

Parametrul variabila_sistem poate lua oricare din valorile care apar la execuia comenzii SHOW ALL. n continuare, sunt prezentate cteva variabile ale sistemului i semnificaia acestora. ARRAY[SIZE] nr_ntreg stabilete numrul de linii (batch) pe care SQL*Plus le recupereaz simultan din baza de date. FEED[BACK] {nr_ntreg | OFF | ON} afieaz numrul de linii returnate de o cerere, atunci cnd aceasta selecteaz un numr de nregistrri mai mare dect valoarea variabilei. HEA[DING] {OFF | ON} determin afiarea capetelor de coloan n rapoarte. LONG {nr_ntreg} determin limea maxim pentru afiarea valorilor LONG, CLOB, NCLOB sau XMLType. LINESIZE nr_ntreg seteaz limea, n caractere, a paginii pe care sunt afiate rezultatele interogrilor. PAGESIZE nr_ntreg seteaz numrul de linii al unei pagini. NUMFORMAT format stabilete formatul implicit pentru afiarea valorilor numerice n rezultatele interogrilor. PAUSE {text | ON | OFF} decide oprirea la nceputul fiecrei pagini de rezultate, urmnd ca defilarea s fie reluat dup apsarea tastei enter. Dac se specific text, acesta va fi afiat la fiecare oprire a defilrii. TIME {ON | OFF} determin afiarea orei curente naintea fiecrui prompt de comand. SUFFIX permite stabilirea extensiei fiierelor script. Implicit, SQL*Plus adaug numelui fiierului extensia .sql. DEFINE seteaz caracterul de substituie, care implicit este &. ESCAPE definete un caracter care, utilizat nainte de caracterul de substituie, determin tratarea acestuia drept un caracter obinuit. Implicit, caracterul escape este \. VERIFY {ON | OFF} determin listarea fiecrei linii din fiierul de comenzi, nainte i dup substituie. CONCAT definete caracterul care separ numele unei variabile sau parametru de substituie de caracterele care i urmeaz imediat. Implicit, acest caracter este .. AUTOTRACE {OFF | ON [EXPLAIN | STATISTICS] | TRACEONLY} determin generarea automat a unui raport asupra planului de execuie furnizat de optimizor i a statisticilor asupra execuiei instruciunilor

LMD. Opiunile ON EXPLAIN, ON STATISTICS afieaz numai planul de execuie al optimizorului, respectiv numai statisticile asupra execuiei instruciunilor SQL. Clauza TRACEONLY are acelai efect ca i ON, dar suprim listarea rezultatului cererii utilizatorului. UND[ERLINE] {_ | c | OFF | ON} specific caracterul folosit pentru sublinierea numelor coloanelor. Exista multe alte setari (n special cele folosite la formatarea rapoartelor) care pot fi vizualizate cu comanda SHWO ALL Execuia instruciunilor SQL i a blocurilor PL/SQL n SQL*Plus, lansarea n execuie a unei instruciuni SQL sau a unui bloc PL/SQL este posibil prin intermediul comenzilor prezentate n continuare. / execut, fr a lista, instruciunea SQL sau blocul PL/SQL stocat curent n buffer-ul SQL. R[UN] listeaz i execut instruciunea SQL sau blocul PL/SQL stocat curent n buffer-ul SQL. EXEC[UTE] instruciune execut o singur instruciune PL/SQL sau ruleaz o procedur stocat. TIMI[NG] [START text | SHOW | STOP] colecteaz i afieaz date asupra resurselor utilizate pentru execuia uneia sau mai multor instruciuni sau blocuri. Comanda colecteaz informaii pentru o perioad de timp ncheiat, salvndu-le ntr-un timer. Pentru tergerea tuturor acestor timer-e, se utilizeaz comanda CLEAR TIMING. @ sau STA[RT]{url | nume_fiier[.ext]} [lista_argumente] lanseaz n execuie comenzile din fiierul specificat. Acesta se poate afla n sistemul de fiiere local sau pe un server Web. @@ nume_fiier[.ext] este o comand similar celei precedente. Ea este util pentru execuia fiierelor imbricate de comenzi ntruct caut fiierul de comenzi specificat, n aceeai cale sau URL n care se afl fiierul de comenzi din care a fost apelat. Nu se pot utiliza parametri atunci cnd se ruleaz o instruciune prin intermediul comenzii RUN sau /. Instruciunea trebuie stocat ntr-un fiier, care va fi rulat prin comanda START sau @.

Editarea instruciunilor SQL i a blocurilor PL/SQL


Anumite aciuni asupra buffer-ului SQL determin ca o anumit linie s devin linia curent a acestuia. Astfel, n urma: afirii unei linii prin comanda LIST, aceasta devine linia curent; execuiei comenzii LIST sau RUN asupra buffer-ului, ultima linie devine linia curent; obinerii unui mesaj de eroare, linia coninnd eroarea devine automat linia curent. Comenzile prezentate n continuare acioneaz asupra liniei curente din buffer-ul SQL. A[PPEND] text - adaug textul specificat la sfritul liniei curente din buffer-ul SQL. Pentru a separa textul de caracterele precedente, se introduc dou spaii ntre APPEND i text. Pentru a introduce un text care se termin cu ;, comanda va fi ncheiat prin dou caractere ; (utilitarul SQL*Plus consider un singur caracter ; drept terminator de comand). C[HANGE] car_separ text_vechi [car_separ [text_nou [car_separ] ] ] modific textul de pe linia curent din buffer-ul SQL. Drept caracter de separare, poate fi utilizat orice caracter care nu este alfanumeric. Spaiul dintre cuvntul cheie CHANGE i primul caracter de separare poate fi omis. DEL [n | n m | n *| n LAST | * | * n |* LAST | LAST] terge una sau mai multe linii din buffer-ul SQL. Caracterul * indic linia curent. Se poate omite spaiul dintre cuvntul cheie DEL i n sau *, dar nu cel dintre DEL i LAST. Comanda DEL fr clauze determin tergerea liniei curente din buffer. I[NPUT] [text] adaug una sau mai multe linii de text dup linia curent din buffer-ul SQL. L[IST] [n |n m | n * | n LAST | * | * n | * LAST | LAST] listeaz una sau mai multe linii din buffer-ul SQL. Sunt valabile precizrile fcute la comanda DEL. CLEAR SCREEN determin tergerea coninutului ecranului. Aceast comand poate fi util, de exemplu, nainte de afiarea unui raport. n text inlocuieste linia n prin text; Exemplu :

>SQL select * from jobs where jobtitle='Prezident' i order by job_title;` >SQL / -- executa >SQL del 2sterge linia 2 >2 order by order by job_title inlocuieste filtru where cu order

Crearea i modificarea fiierelor de comenzi (script)


n mediul SQL*Plus, prelucrarea fiierelor de comenzi este permis prin intermediul instruciunilor prezentate n continuare. ED[IT] [nume_fiier[.ext] ] invoc un editor de text al sistemului de operare gazd pentru a deschide fiierul de comenzi specificat sau pentru a edita buffer-ul SQL. GET nume_fiier[.ext] ncarc un fiier al sistemului de operare gazd n buffer-ul SQL. SAV[E] file_name[.ext] salveaz coninutul buffer-ului SQL ntr-un fiier al sistemului de operare gazd.
SAVE alfa EDIT alfa @alfa

STORE SET nume_fiier[.ext] salveaz parametrii sesiunii SQL*Plus curente ntr-un fiier al sistemului de operare gazd. WHENEVER OSERROR {EXIT | CONTINUE} poate determina ieirea din mediul SQL*Plus dac apare o eroare a sistemului de operare (de exemplu, o eroare de intrare/ieire n/din fiier). WHENEVER SQLERROR {EXIT | CONTINUE} poate determina ieirea din mediul SQL*Plus dac o comand SQL sau un bloc PL/SQL genereaz o eroare. ntr-un fiier de comenzi, comentariile pot fi plasate n trei moduri. Comanda REM[ARK] marcheaz nceputul unui comentariu pe o singur linie ntr-un fiier script. Delimitatorii /**/ permit introducerea de comentarii, coninnd una sau mai multe linii, n instruciunile SQL sau n blocurile PL/SQL. Comentariile ANSI/ISO sunt marcate de caracterele -- i permit introducerea unui comentariu pe o singur linie, n cadrul unei

instruciuni SQL sau bloc PL/SQL. Pentru a obine informaii referitoare la structura tabelelor, vizualizrilor sau sinonimelor, a procedurilor, funciilor sau pachetelor fr a fi necesar consultarea cataloagelor de sistem, se utilizeaz comanda: DESC[RIBE] [nume_schema.]nume_obiect Ex. Desc tabs

Interactivitate n SQL*Plus Comenzile prezentate n continuare permit interaciunea dintre mediul SQL*Plus i utilizator. ACC[EPT] variabila [tip] [PROMPT text] citete o linie de intrare i o stocheaz ntr-o variabil utilizator. DEF[INE] [variabila] | [variabila = text] specific o variabil utilizator, creia i se poate atribui o valoare de tipul CHAR. Fr argumente, comanda listeaz valorile i tipurile tuturor variabilelor. Sistemul Oracle9i a introdus variabila CONNECT_IDENTIFIER care conine SIDul corespunztor conexiunii utilizatorului. Aceasta permite ca informaia asupra conectrii s poat fi accesat ca i oricare alt variabil specificat prin comanda DEFINE. PAU[SE] [text] afieaz o linie vid, urmat de o linie coninnd text, apoi ateapt ca utilizatorul s acioneze tasta enter. PROMPT [text] afieaz mesajul specificat sau o linie vid pe ecranul utilizatorului. UNDEF[INE] variabila permite tergerea variabilelor definite de utilizator fie explicit, prin comanda DEFINE, fie implicit, printr-un argument n comanda START. Exemplu: ACCEPT alfa PROMPT Numarul de exemplare: ACCEPT beta PROMPT Numele autorului: SELECT * FROM carte WHERE nrex = &alfa AND autor = &beta;

Variabilele de substituie (&nume)


Aceste variabile sunt utilizate pentru stocarea temporar a unor valori. Variabilele pot s apar n comenzi SQL sau SQL*Plus. Interfaa cere utilizatorului s dea valori de fiecare dat cnd ntlnete o variabil nedefinit. Dac variabila este precedat de simbolurile &&, doar la prima apelare se va solicita o valoare. Exemplu: SELECT nume, &&salariu FROM salariat ORDER BY &salariu; Pentru variabilele de tip caracter sau de tip dat calendaristic este obligatorie folosirea ghilimelelor. Variabilele de substituie pot s apar n condiia WHERE, n clauza ORDER BY, n expresia unei coloane, n numele unui tabel, n locul unei ntregi comenzi SELECT. Exemplu: SELECT &coloana FROM &tabel WHERE &conditie ORDER BY &ordine; Comanda SET VER[IFY] {ON | OFF} permite listarea (sau nu) textului unei comenzi SQL sau PL/SQL, inainte si dupa ce SQL*Plus inlocuieste variabilele de substitutie cu valori efective. SQL*Plus permite definirea variabilelor utilizator de tip CHAR prin: DEFINE variabil = valoare Variabila rmne definit pn cnd fie se prsete SQL*Plus, fie se d comanda UNDEFINE pentru variabila respectiv. Tiprirea tuturor variabilelor utilizator, a valorilor i tipurilor acestora se obine prin forma DEFINE. Exemplu: SQL> DEFINE autor1 = Zola SQL> DEFINE autor2 = Blaga SQL> SELECT titlu, nrex 2 FROM carte 3 WHERE autor = &autor1 4 OR autor = &autor2;

Crearea i afiarea variabilelor de legtur Variabilele de legtur (bind variables) se creeaz n SQL*Plus i pot fi referite n SQL sau PL/SQL. Ele au urmtoarele funcionaliti: permit afiarea n SQL*Plus a valorilor utilizate n blocuri PL/SQL (variabilele declarate n blocurile PL/SQL nu pot fi afiate n SQL*Plus); pot fi utilizate n mai multe blocuri PL/SQL, permind comunicarea ntre acestea. Mediul SQL*Plus furnizeaz comenzi utile n lucrul cu astfel de variabile. PRI[NT] [variabila] afieaz valoarea unei variabile de legtur. VAR[IABLE] [variabila tip] declar o variabil de legtur care poate fi referit n blocurile PL/SQL. Dac nu se specific nici un argument, comanda VARIABLE listeaz toate variabilele de legtur create n sesiunea curent. Referirea unei variabile de legtur se realizeaz n PL/SQL precednd numele variabilei prin caracterul :. Comenzi SQL*Plus diverse Utilizatorul dispune de comenzi pentru conectarea sau deconectarea unui utilizator de la mediul SQL*Plus, descrierea obiectelor bazei de date, prsirea sesiunii curente, afiarea unor informaii totalizatoare sau a valorilor pentru variabilele sistem sau de mediu. Instruciunea DESC[RIBE] { [schema.]nume_obiect[@id_conectare] } listeaz definiiile coloanelor pentru tabelul, vizualizarea sau sinonimul specificat. Pentru o funcie sau procedur, aceast comand listeaz specificaia obiectului respectiv. {EXIT | QUIT} [COMMIT | ROLLBACK] salveaz sau anuleaz modificrile aflate n ateptare, deconecteaz utilizatorul de la Oracle, nchide SQL*Plus i pred controlul sistemului de operare. Opiunea COMMIT este implicit. Comanda SHO[W] opiune afieaz valorile pentru variabilele sistem SQL*Plus sau cele ale mediului SQL*Plus curent. Opiunile care pot fi prezente n comanda SHOW sunt urmtoarele: numele unei variabile a sistemului, ALL, BTI[TLE], ERRORS, LNO, PNO, REL[EASE], REPF[OOTER], REPH[EADER], SGA, SQLCODE, TTI[TLE], USER. Clauza ALL determin listarea valorilor corespunztoare tuturor opiunilor comenzii SHOW, cu excepia lui SGA i ERRORS.

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