Oracle

Comanda UPDATE

Comanda UPDATE este folosită pentru a modifica valorile datelor existente în tabele.
Sintaxa uzuală a comenzii UPDATE prezintă următoarele variante:
1)
UPDATE tabel
SET coloana1 = expresie1,
coloana2 = expresie2, …
[WHERE condiţie];
2)
UPDATE tabel
SET coloana1 = expresie1,
coloana2 = expresie2, …
FROM tabele_cuplate
[WHERE condiţie];
Clauza FROM este o extensie specifica SQL Server, inexistenta în standardul SQL92 . Prin această extensie se poate specifica o cuplare de mai multe tabele care se poate folosi în locul unei fraze Select imbricată în clauza WHERE. Sunt acceptate toate tipurile de asocieri (Inner, Left, Right, Full) sunt acceptate şi reyultate obţinute din fraze Select.


Comanda UPDATE modifică valorile înregistrărilor în funcţie de condiţia clauzei WHERE. În lipsa clauzei WHERE, vor fi actualizate toate înregistrările din tabelul dat.

Expresia furnizată ca valoare nouă a unei coloane poate cuprinde valorile curente ale câmpurilor din înregistrarea care este actualizată.
Exemple:
update tProduse set pret=pret1.1

update tProduse set pret=pret
0.95 where categoria = ‘Alimentare’

update tProduse set pret=pret*0.95 where codProd in (select codProd from tProduse where categoria = ‘Alimentare’)

update tProduse set pret=CASE
When pret<100 then pret*1.1
When pret<200 then pret*1.08
When pret<300 then pret*1.05
Else pret1.03
END


Presupunând că avem un tabel tModiPret cu structura:

createtable tModiPret
( codProd char(10)primarykey,
procent float
)

ce conţine procentele diferentiate de modificare a preturilor anumitor produse,
Pentru a modifica datele din tabela tProduse pe baza datelor din tabela tModiPret se poate folosi următoarea comandă care conţine tabele corelate



update tProduse set pret=pret
1.1
from
tProduse A inner join tModiPret B on A.codProd=B.codProd
sau
UPDATE tProduse
SET pret=pret*(1+(SELECT procent
FROM tModiPret A
WHERE A.codP=tProduse.codProd)/100)
WHERE codProd IN (SELECT codProd FROM tModiPret);
Obs. Daca nu includem conditia
WHERE codProd IN (SELECT codProd FROM tModiPret)
atunci
(SELECT procent
FROM tModiPret A
WHERE A.codP=tProduse.codProd)/100)
Va returna null pentru valorile din coloana codProd ce nu se gasesc în tModiPret şi prin urmare pentru aceste coduri, pret va fi setat cu null
Dacă tabelul de actualizat este implicat în diverse legături cu alte tabele ca partea unu a unei legături unu la multi şi opţiunea update cascading este activată atunci orice modificare în cămpul de legatură va fi propagată şi în tabelele secundare corelate
ALTERTABLE tDetaliiBon ADDFOREIGNKEY(CodProd)
REFERENCES tProduse (CodProd)onupdatecascade
update tProduse set codProd =‘p101’where codProd=‘p1’
va produce automat modificarea în tabelul tDetaliiBon din codProd=‘p1’ în codProd =‘p101’
Comanda DELETE
Comanda DELETE realizează ştergerea înregistrărilor dintr-un tabel în funcţie de anumite condiţii.
Comanda DELETE şterge numai înregistrări din tabel nu şi tabelul. Pentru a şterge un tabel se foloseşte comanda DROPTABLE.
Sintaxa uzuală a comenzii DELETE prezintă următoarele variante:
1)
DELETE [FROM] tabel
[WHERE condiţie];

2)
DELETE [FROM] tabel
FROM tabele_cuplate
[WHERE condiţie];


Similar comenzii UPDATE, comanda DELETE şterge anumite înregistrări în funcţie de condiţia din clauza WHERE. În lipsa clauzei WHERE vor fi şterse toate înregistrările din tabelul dat. În această clauză pot fi incluse şi subinterogări.

De exemplu următoarea comandă şterge toate înregistrările pentru care gradul didactic este asistent

DELETE tDetaliiBon
Şterge toate rândurile tabelului tDetaliiBon
DELETE tDetaliiBon where NrBon=’101’
Şterge toate rândurile tabelului tDetaliiBon pentru care NrBon=’101’

DELETE tDetaliiBon
from tBonuriConsum A inner join tDetaliiBon B on A.NrBon=B.NrBon
where dataBon <‘01/01/2008’

DELETE tBonuriConsum where dataBon <‘01/01/2008’

Dacă tabelul din care ştergem este implicat în diverse legături cu alte tabele ca partea unu a unei legături unu la multi şi opţiunea delete cascading este activată atunci ştergerea unui rând va genera ştergerea tuturor rândurilor ce corespund la cheie din tabelele secundare corelate.
altertable tDetaliiBon
addconstraint Fk_NrBon_tDet
foreignkey(NrBon)
references tBonuriConsum (NrBon)ondeletecascade
deletefrom tBonuriConsum where NrBon=‘104’
va produce stergerea automată din tabelul tDetaliiBon a tuturor rândurilor pentru care NrBon=’104’

Comanda TRUNCATE


Pentru a şterge în mod rapid toate înregistrările dintr-o tabelă se foloseşte comanda TRUNCATE cu următoarea sintaxă:
TRUNCATE TABLE tabel
Exemplu
truncatetable tModiPret
Ştergerea înregistrărilor cu ajutorul comenzii TRUNCATE este mult mai avantajoasă decât eliminarea tabelului şi recrearea lui ulterioară deoarece eliminarea tabelului necesită recrearea indecşilor, constrângerilor de integritate, declanşatoarelor etc.