Nu se poate şterge doar o parte (o valoare a unui câmp) a unei linii (înregistrare).
Formatul general:
DELETE FROM <table_name>;
Toate liniile care verifică condiţia scrisă în cadrul clauzei Where vor fi eliminate.
Exemple:
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);
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);
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);
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.
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> 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.
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.
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));
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:
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;