Sunteți pe pagina 1din 7

INSTRUCŢIUNEA DELETE

Nu se poate şterge doar o parte (o valoare a unui câmp) a unei linii (înregistrare).
Formatul general:
DELETE FROM <table_name>;

DELETE FROM <table_name>


WHERE <condition>;

Toate liniile care verifică condiţia scrisă în cadrul clauzei Where vor fi eliminate.

Exemple:

delete from (select *


from employee
where dept_id=1003);

delete from author


where author_key in ('A101','A103','A120'); 

SUBINTEROGĂRI

Subinterogarea (subquery) este o instrucţiune SELECT care apare într-o clauză a altei
instrucţiuni SELECT. Subinterogarea poate fi plasată în clauzele WHERE, HAVING sau
FROM. Operatorii folosiţi pot fi:
- >, =, >=, <, <>,<=
- IN, ANY, ALL

SELECT lista_câmpuri
FROM table
WHERE expresie operator
(SELECT listă_câmpuri
FROM tabel);

Exemplu:
1. Să se afişeze numele angajaţilor care au un salariu mai mare decât al angajatului care
are codul 7566.
SELECT ename, sal
FROM emp
WHERE sal > (SELECT sal
FROM emp
WHERE empno=7566);

Subinterogarea returnează salariul angajatului care are codul 7566 (empno=7566).


Rezultatul acestei subinterogări (interogare interioară) este folosit de interogarea
principală (exterioară) pentru a afişa toţi angajaţii care câştigă mai mult decât angajatul
care are codul 7566.

1
Tipuri de subinterogări
- subinterogări care au ca rezultat o singură linie (single-row subquery);
- subinterogări care au ca rezultat mai multe linii (multiple-row subquery);
- subinterogări care au ca rezultat mai multe coloane (multiple-column subquery).

Observaţii:
- subinterogările trebuie incluse între paranteze rotunde;
- subinterogările trebuie plasate în partea dreaptă a operatorului de comparare;
- nu se va adăuga o clauză ORDER BY într-o subinterogare;
- pentru subinterogările care au ca rezultat o singură linie (single-row subquery) se
va folosi unul din operatorii: =, >, >=, <, <=, <>;
- pentru subinterogările care au ca rezultat mai multe linii (multiple-row subquery)
se va folosi unul din operatorii: IN, ANY, ALL, care pot fi asociaţi cu operatorul
NOT.

Exemple:
2. Să se afişeze angajaţii care au acelaşi job cu angajatul al cărui cod este 7369:
SELECT ename, job
FROM emp
WHERE job= (SELECT job
FROM emp
WHERE empno=7369);

3. Să se afişeze angajaţii care au acelaşi job cu angajatul al cărui cod este 7369 şi au un
salariu mai mare decât al angajatului cu codul 7876:
SELECT ename, job, sal
FROM emp
WHERE job=(SELECT job
FROM emp
WHERE empno=7369)
AND sal > (SELECT sal
FROM emp
WHERE empno=7876);

4. Să se afişeze numele, jobul şi salariul angajaţilor/angajatului care au/are salariul


minim:
SELECT ename, job, sal
FROM emp
WHERE sal=(SELECT MIN(sal)
FROM emp);

5. Să se afişeze codul departamentului şi salariul minim pe departament, pentru acele


departamente pentru care salariul minim este mai mare decât salariul minim al
departamentului 20:
SELECT deptno, MIN(sal)
FROM emp
GROUP BY deptno
HAVING MIN(sal)> (SELECT MIN(sal)
FROM emp
WHERE deptno=20);

2
6. Să se afişeze job-ul pentru care salariul mediu este minim:
SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)=(SELECT MIN(AVG(sal))
FROM emp
GROUP BY job);

7. Să se afişeze numele angajaţilor, codul departamentului şi salariul pentru cei care au


salariul minim în fiecare departament:
SELECT ename, sal, deptno
FROM emp
WHERE sal IN (SELECT MIN(sal)
FROM emp
GROUP BY deptno);

8. Să se afişeze angajaţii al căror salariu este mai mic decât al oricărui angajat care are
jobul CLERK, dar nu sunt CLERK.
SELECT ename, job, sal
FROM emp
WHERE sal<ANY (SELECT sal
FROM emp
WHERE job=’CLERK’)
AND job<>’CLERK’;

9. Să se afişeze angajaţii (cod, nume, job) al căror salariu este mai mare decât salariul
mediu al tuturor departmentelor.
SELECT empno, ename, job
FROM emp
WHERE sal >ALL (SELECT AVG(sal)
FROM emp
GROUP BY deptno);

Observaţii:
- pt. operatorul ANY – se presupune că este adevărată condiţia - în cazul în care
comparaţia este adevărată pentru cel puţin una dintre valorile returnate de
subinterogare.
- pt. operatorul ALL – se presupune că este adevărată condiţia dacă comparaţia este
adevărată pentru toate elementele listei returnate.

Introducere în PL/SQL
SQL a fost gândit ca un limbaj de generaţia a IV-a, neprocedural, orientat pe seturi de
înregistrări. Deşi extrem de puternic, SQL nu poate acoperi toate cerinţele unei aplicaţii,
în ceea ce priveşte prelucrarea datelor, comunicarea cu alte module şi cu utilizatorul,
listarea informaţiilor sub formă de rapoarte standardizate, etc. PL/SQL este un limbaj de
programare orientat spre baze de date care extinde capacităţile procedurale ale SQL-ului.
Pentru a rezolva probleme legate de baze de date, SQL şi PL/SQL trebuie îmbinate.
PL/SQL este utilizat în mod special pentru a scrie triggere şi/sau proceduri stocate.

3
Acestea sunt unităţi de cod procedural care sunt stocate într-o formă compilată în baza de
date.

Structuri de bază în PL/SQL


PL înseamnă Procedural Language (deci limbaj procedural). Acesta este mai puternic
decât SQL-ul. Unitatea de bază din PL/SQL se numeşte bloc. Toate programele sunt
constituite din blocuri, care pot fi imbricate. Fiecare bloc are următoarea structură:
DECLARE
/* Sectiunea de declarare: variabile, tipuri de date,
subprograme locale */
BEGIN
/* Secţiunea executabilă: declaraţii SQL sau proceduri*/
/* Este singura secţiune din bloc care trebuie să apară */
EXCEPTION
/* Secţiunea de lucru cu excepţiile: declaraţii de lucru cu
erorile */
END;

Observaţii:
 Singura secţiune necesară este cea de execuţie; celelalte secţiuni sunt opţionale.
 Singurele declaraţii SQL permise sunt SELECT, INSERT, UPDATE, DELETE şi alte
manipulări de date sau controale legate de tranzacţie. Totuşi, fraza SELECT are o
formă specială în care un singur tuplu () este salvat în variabile. Restul
instrucţiunilor de definire de date, cum ar fi CREATE, DROP, sau ALTER nu sunt
permise.
 Secţiunea executabilă poate conţine asignări, decizii, cicluri, apeluri de proceduri,
şi triggere.
 PL/SQL nu este Case Sensitive (nu face diferenţe între litere mici şi mari).
 Pot fi utilizate comentariile /* ... */.

Primul exemplu de PL/SQL poate fi un bloc anonim — adică un scurt program care se
execută o singură dată, dar care nu este denumit şi nici stocat în baza de date.

SQL> SET SERVEROUTPUT ON

SQL> BEGIN
2 dbms_output.put_line('Buna dimineata!');
3 END;
4 /
 SET SERVEROUTPUT ON este o comandă SQL care activează consola spre afişare.
Aceasta (consola) trebuie activată doar o singură dată în timpul unei sesiuni de
lucru.
 Cuvintele cheie BEGIN...END definesc scopul  şi sunt echivalente cu
acoladele din Java {...}
 Caracterul (;) marchează sfârşitul declaraţiei
 Funcţia put_line (face parte din pachetul dbms_output) afişează un şir de
caractere la consola SQL*Plus (pe ecran).

4
Compilarea codului

Codul PL/SQL este compilat automat de SQL. Este recomandată tastarea programului
într-un editor extern, aşa cum făceam cu instrucţiunile clasice SQL.

Erori

Dacă programul nu este un bloc anonim, erorile nu vor fi raportate, SQL afişând doar
mesajul ``warning: procedure created with compilation errors''. Pentru a vedea erorile
trebuie să tastăm:
SQL> SHOW ERRORS

Cel mai simplu mod de lucru este efectuarea unor declaraţii urmată de o secţiune
executabilă care constă în una sau mai multe enunţuri SQL cu care suntem obişnuiţi.
Diferenţa majoră este forma instrucţiunii SQL: după clauza SELECT, trebuie să avem o
clauză INTO în care să enumerăm variabilele, pentru fiecare atribut din SELECT câte o
variabilă.

Pentru a executa un program PL/SQL, textul în sine trebuie fie încheiat cu un punct “.”,
urmată de o linie pe care se tastează run;

Informaţiile sunt transmise între programul PL/SQL şi baza de date prin intermediul unor
variabile. Fiecare variabilă are un tip specific asociat acesteia Tipurile pot fi:
 Unul din tipurile utilizate în SQL pentru câmpurile tabelei;
 Un tip generic utilizat în PL/SQL cum ar fi NUMBER
 Declarat ca să fie de acelaşi tip cu câmpul din baza de date.

Observaţii
 Cel mai utilizat tip este NUMBER. Variabilele de tip NUMBER pot reţine fie un întreg,
fie un număr real.
 Pentru şiruri de caractere, cel mai utilizat este VARCHAR(n), unde n este lungimea
maximă a şirului în bytes. Lungimea trebuie neapărat precizată, nu există o
valoarea implicită. De exemplu, putem declara:
DECLARE
pret NUMBER;
denumire VARCHAR(20);

 PL/SQL permite variabile BOOLEAN (logice), chiar dacă Oracle nu suportă acest tip
pentru câmpurile tabelei.

 De obicei, se foloseşte operatorul %TYPE. De exemplu:


DECLARE
v_nume Stud.nume%TYPE;
defineşte pentru variabila v_nume acelaşi tip de dată ca şi câmpul nume din tabela Stud.

Dacă există o variabilă care este de tip articol, cu mai multe câmpuri, cea mai simplă
posibilitate de declarare a acestei variabile este utilizarea operatorului %ROWTYPE.

5
Rezultatul este un tip articol (înregistrare) în care câmpurile au acelaşi nume şi tip ca şi
numele câmpurilor din tabelă. De exemplu:
DECLARE
v_date_stud Stud%ROWTYPE;
defineşte variabila v_date_stud ca un articol cu exact aceleaşi câmpuri ca şi tabela Stud,
fiind selectată pe rând câte o înregistrare.

Valoarea iniţială a oricărei variabile, indiferent de tipul ei, este Null.


Putem asocia valori unei variabile utilizând operatorul de atribuire ":=". Asignarea poate
surveni imediat după declararea tipului variabilei, sau oriunde în cadrul porţiunii
executabile a programului. De exemplu:
DECLARE
a NUMBER := 3;
BEGIN
a := a + 1;
END;
.
run;
Programul nu are nici un efect, pentru că asupra bazei de date nu se efectuează nici o
modificare.

Alt exemplu:
CREATE TABLE angajati (coda NUMBER (4) CONSTRAINT pk_coda PRIMARY KEY,
nume VARCHAR2(15), pren VARCHAR2(15),orel NUMBER (3), bonus NUMBER(5,2), salar
NUMBER(6));

SET SERVEROUTPUT ON;

DECLARE
v_salar NUMBER;
v_ore_lucrate NUMBER := 40;
v_salar_orar NUMBER := 22.50;
v_bonus NUMBER := 150;
v_ang1 angajati%ROWTYPE;
BEGIN
v_salar := (v_ore_lucrate * v_salar_orar) + v_bonus;
v_ang1.pren := 'Ion';
v_ang1.nume := 'POP';
DBMS_OUTPUT.PUT_LINE ('Nume'||' '||'Prenume'||' '||'Salar');
DBMS_OUTPUT.PUT_LINE (v_ang1.nume||' '||v_ang1.pren||' '||v_salar);
END;
/
run;

Alt exemplu:

INSERT INTO angajati VALUES (100, 'POP', 'Ion', 2.5, 500);


INSERT INTO angajati VALUES (101, 'LUSTREA', 'Anca', 3.5, 600);

SET SERVEROUTPUT ON;

DECLARE
v_bonus NUMBER(8,2);
v_coda NUMBER(4) := 100;
BEGIN
SELECT salar * 0.10 INTO v_bonus FROM angajati

6
WHERE coda=v_coda;
DBMS_OUTPUT.PUT_LINE ('Bonus 10% pt. ang cu codul 100:'||' '||v_bonus);
END;
/
run;

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