Documente Academic
Documente Profesional
Documente Cultură
SGBDC
SGBDC
1
8. In Oracle, o baza de date
A. Este detinuta de un utilizator
B. Poate avea definite unul sau mai multe conturi de utilizator
C. Poate contine date system (de exemplu, schema sistemului) si date de utilizator (aplicatie)
D. Este acelasi lucru cu o schema
E. Este gestionata de o instanta Oracle
Raspuns B, C, E
9. Privilegiile de system
A. Sunt acordate intr-o maniera similara Oracle, Sybase si Microsoft SQL Server
B. Sunt specifice unui obiect al bazei de date
C. Permit beneficiarului sa efectueze o serie de functii administrative pe server, cum ar fi
oprirea serverului
D. Sunt anulate cu ajutorul instructiunii SQL REMOVE
E. Variaza intre bazele de date provenite de la producatori diferiti
Raspuns A, C, E
12. Rolurile
A. Pot fi atribuite unui singur utilizator
B. Pot fi partajate de mai multi utilizatori
C. Pot exista inainte de existenta utilizatorilor
D. Pot contine oricate privilegii de obiecte
E. Pot contine un singur privilegiu de obiecte
Raspuns B, C, D
14. Vizualizarile pot ajuta la implementarea politicii de securitate prin restrictionarea coloanelor
dintr-un table la care are acces un utilizator
A. Restrictionarea coloanelor dintr-un tavel la care are acces un utilizator
B. Restrictionarea bazelor de date la care are acces un utilizator
C. Restrictionarea randurilor dintr-un table la care acces un utilizator
D. Stocarea rezultatelor auditarii bazei de date
E. Monitorizarea intrusilor la baza de date
Raspuns A, C
2
15. Rolurile sunt create in Microsoft SQL Server si Sybase Adaptive Server utilizand
A. Procedura memorata sp_create_role
B. Procedura memorata sp_add_role
C. Procedura memorata sp_addrole
D. Instructiunea CREATE TABLE
E. Instructiunea GRANT
Raspuns C
17. Privilegiile de roluri sunt atribuite utilizatorilor de baze de date in Microsoft SQL Server si Sybase
Adaptive Server folosind
A. Procedura memorata sp_create_role_member
B. Procedura memorata sp_add_role_member
C. Procedura memorata sp_addrolemember
D. Instructiunea CREATE ROLE MEMBER
E. Instructiunea GRANT
Raspuns C
18. Privilegiile de roluri sunt atribuite utilizatorilor de baze de date in Oracle folosind
A. Procedura memorata sp_create_role_member
B. Procedura memorataq sp_add-role_member
C. Procedura memorata sp_addrolemember
D. Instructiunea CREATE ROLE MEMBER
E. Instructiunea GRANT
Raspuns E
19. Scrieti instructiunea SQL pentru a acorda utilizarorilor manager_1 si manager_2 privilegiile
SELECT, INSERT si DELETE pentru randurile din tabelul EMPLOYESS. Daca vreti sa tastati
instructiunea, la inceput va trebui sa creati utilizatorii manager_1 si manager_1
Raspuns
GRANT SELECT, INSERT, DELETE
ON EMPLOYEE
TO manager_1, manager_2<
20. Scrieti instructiunea SQL pentru a adauga privilegiile INSERT, UPDATE si DELETE ale
utilizatorului clerk_127 la tabelul MOVIE. Daca vreti sa testati instructiunea, la inceput va trebui sa
creati utilizatorul clerk_127
Raspuns
REVOKE INSERT, UPDATE, DELETE
ON MOVIE
FROM clerk_127;
3
Cap. 9 - Mentinerea integritatii bazei de date cu ajutorul tranzactiilor
1. O tranzactie
A. Poate fi procesata partial
B. Nu poate fi procesata partial
C. Schimba baza de date dintr-o stare consistenta in alta
D. Este denumita uneori unitate de lucru
E. Are proprietatile deschise de acronimul ACID
Raspuns B, C, D, E
11. In modul implicit pentru tranzactii din Microsoft SQl Server, o tranzactie noua este initiata de
A. Conectarea la baza de date
B. O instructiune COMMIT
C. O instructiune ROLLBACK
D. O Instructiune INSERT
E. O instructiune SELECT
Raspuns D
12. In modul implicit pentru tranzactii in Oracle, o tranzactie noua este initiata de
A. Conectarea la baza de date
B. O instructiune COMMIT
C. O instructiune ROLLBACK
D. O Instructiune INSERT
E. O instructiune SELECT
Raspuns A, B, C
13. Instructiunile SQL utilizate pentru gestionarea tranzactiilor in Microsoft SQL Server si Sybase
Adaptive Server sunt
A. BEGIN TRANSACTION
B. END TRANSACTION
C. COMMIT
D. ROLLBACK
E. SET AUTOCOMMIT
Raspuns A, C, E
5
15. In My SQL, suportul pentru tranzactii
A. Se aplica doar motoarelor de stocare ISAM si MyISAM
B. Se aplica doar motoarelor de stocare InnoDB si BDB
C. Include modulele finalizare automata, implicit si explicit
D. Include modurile finalizare automata si implicit
E. Include modurile finalizare automata si explicit
Raspuns B, D
16. Instructiunile SQL utilizate pentru gestionarea tranzactiilor in DB2 UDB sunt
A. BEGIN TRANSACTION
B. END TRANSACTION
C. COMMIT
D. ROLLBACK
E. SAVE POINT
Raspuns C, D, E
19. O blocare
A. Este un element de control atasat datelor pentru a le rezerva in scopul actualizarii de catre utilizator
B. Este anulata de obicei atunci cand are loc o operatie COMMIT sau ROLLBACK
C. Are setat un interval de asteptare in sistemul DB2 si alte produse RDBMS
D. Poate provoca aparitia unor conflicte atunci cand alti utilizatori incearca sa actualizeze datele
blocate
E. Poate avea niveluri si un protocol de extindere in unele produse RDBMS
Raspuns B, C, D, E
20. O interblocare
A. Este o blocare care a depasit intervalul de asteptare si din acest motiv nu mai este necesara
B. Apare cand doi utilizatori ai bazei de date solicita simultar blocarea unor date blocate de
celalalt utilizator
C. Poate, teoretic, sa plaseze doi sau mai multi utilizatori intr-o stare de asteptare finita
D. Poate fi rezolvata prin detectarea interblocarilor in unele sisteme RDBMS
E. Poate fi rezolvata prin intervale de asteptare a blocarii in unele sisteme EDBMS
Raspuns B, D, E
6
Capitolul 10 - Integrarea limbajului SQL in aplicatii
1. Un cursor este
A. Colectia de randuri returnate de o interograre la baza de date
B. Un pointer(indicator) intr-un set de rezultate
C. Acelasi lucru cu un set de rezultate
D. Un buffer care pastreaza randurile extrase din baza de date
E. O metoda de analiza a performantei instructiunilor SQL
Raspuns B
4. Cursoanele sunt:
A. Destinate sa anuleze nepotrivirea dintre modul in care trateaza rezultatele unei interogari limbajele
orientate pe obiecte si bazele de date relationale
B. Destinate sa anuleze nepotrivirea dintre modul in care trateaza rezultatele unei interogori
limbajele procedurale si bazele de date relationale
C. Incluse in limbajul Oracle PL/SQL
D. Incluse in limbajul Sybase Transact-SQL
E. Incluse in limbajul Microsoft Transact-SQL
Raspuns B, C, D, E
9. JDBC este:
A. O interfata API standard pentru conectarea la sistemele DBMS
B. Independent de orice limbaj, sistem de operare sau sistem DBMS
C. Un standard Microsift
D. Utilizat de programele java
E. Flexibil in tratarea limbajelor SQL proprietate
Raspuns A, D, E
8
15. O procedura memorata este:
A. Executata doar atunci cand este apelata
B. Executata automat pe baza unui eveniment din baza de date
C. Scrisa intr-un limbaj neprocedural
D. Scrisa intr-un limbaj procedural
E. Stocata in baza de date
Raspuns A, D, E
16. Transact-SQL
A. Apare in Oracle si Microsoft SQL Server
B. A aparut prima data in 1987
C. Include limbajul SQL standard insotit de extensii procedurale
D. A fost dezvoltat in partenereriat de oracle si Sybase
E. Este limbajul folosit pentru numeroase proceduri memorate oferite de Microsoft si sybase
Raspuns C, E
18. PL/SQL
A. A fost cunoscut initial ca Ada
B. A fost lansat prima data in 1991
C. A fost dezvoltat de CIA
D. Nu include instruciuni SQL standard
E. A aparut prima data in sistemul Oracle versiunea 6
Raspuns B, D, E
9
Cap.11 – Elemente de ajustare si performanta ale limbajului SQL
6. Optimizatorul de interogari
A. Creaza un plan de executie a interogarii in tabelul de planuri
B. Determina cea mai buna cale de executie a unei instructiuni SQL
C. Poate folosi date statistice adunate din baza de date
D. Poate folosi reguli aplicate modului in care a fost scrisa instructiunea
E. Poate fi bazat pe cost sau bazat pe reguli
Raspuns B, C, D, E
10
8. Scanarile unui tabel pot fi evitate
A. Incluzand o clauza WHERE care refera o coloana indexata
B. Folosind GROUP BY in loc de DISTINCT
C. Asigurandu-va ca datele statistice sunt actualizate
D. Configurand cel putin un predicat sa faca referire la coloana principala a unui index
E. Evitand coloanele care nu sunt folositoare
Raspuns A, C, D
©GMX
12
SISTEME DE GESTIUNE A BAZELOR DE DATE 2007-2008
3) Datele sunt:
a) informatii contextualizate
b) cunostinte care au suferit prea putine prelucrari
c) informatii primare
Raspuns C
4) Informatiile sunt:
a) date contextualizate
b) date validate, organizate si relationate
c) cunostinte care au suferit doar putine prelucrari
Raspuns B
5) Cunostintele sunt:
a) informatii contextualizate
b) date contextualizate
c) informatii validate, organizate si relationate
Raspuns A
8) Sistemele de gestiune a bazelor de date relationale comerciale sunt sistemele de gestiune care respectă:
a) cele 12 reguli ale lui Chuck Kelly
b) cele 12 reguli ale lui E.F. Codd
c) cele 12 reguli restrictii ale lui D.L. Childs
Raspuns B
1
9) Modelul relational se bazează pe:
a) notiunea matematică de relatie binară între multimi
b) noŃiunea matematică de submultime a unui produs cartezian de mulŃimi
c) noŃiunea matematică de relaŃie ternară între mulŃimi
Raspuns B
Reamintim faptul că în modelul relaŃional, orice entitate si relaŃie dintre entităŃi este modelată matematic prin
conceptul de relaŃie si reprezentată convenŃional printr-o tabelă
Rezolvarea relatiilor n-m
In acest caz, ne bazăm pe faptul că în modelul relaŃional nu numai entităŃile ci si relaŃiile dintre ele sunt relaŃii în
sens matematic si, ca urmare, pot fi reprezentate prin tabele.
15) Independenta fată de strategiile de acces la datele dintr-o bază de date este:
a) necesară
b) interzisă
c) optională
Raspuns A
2
17) Reprezentarea fizică a datelor din baza de date este descrisă la nivelul:
a) hibrid;
b) intern;
c) conceptual;
Raspuns B
3
c) actualizare, adăugare, stergere si creare de table
Raspuns C
5
a) de tip retea
b) de tip stea
c) de tip ierarhic
Raspuns B
71) Cel mai simplu mod de vizualizare a datelor dintr-un depozit de date este reprezentat de:
a) un cub n-dimensional;
b) o stea;
c) si (a) si (b)
Raspuns A
72) O bază de date multimedia este o bază de date care inglobează informatie de tip:
a) text, sunet, grafic;
b) sunet, imagini fixe si video
c) text, grafic, sonor, animat, video;
Raspuns C
9
1. Creati tabelul salariat_*** având următoarea structură:
varsta NUMBER(2)
email CHAR(50)
salariu Valoare implicită 0 NUMBER(9,2)
4. Inserati în tabelul salariat_*** prima înregistrare din tabelul de mai sus fără să precizati lista de coloane
în comanda INSERT.
INSERT INTO salariat VALUES (
1, '.....', '.....', 'director', null ,’' , 30, '.....', 5500 );
5. Inserati a doua înregistrare folosind o listă de coloane din care excludeti data_angajarii si salariul care
au valori implicite. Observati
apoi rezultatul.
COD_ANG NUME PRENUME FUNCTIA SEF DATA_ANG VARSTA EMAIL SALARIU
2 ..... ..... fuctionar 1 ..... 25 ..... 0
INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email)
VALUES (2, '...', '...', 'functionar', 1, 25, '...' );
6. Inserati înregistrările 3 si 4.
INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email, salariu) VALUES (3, '...', '...',
'economist', 1, 45, '...', 3000 );
INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email, salariu) VALUES (4, '...', '...',
'functionar', 1, 35, '...', 1000 );
7. Creati tabelul functionar_*** care să contină functionarii din tabelul salariat_***, având următoarele
coloane: codul, numele, salariul anual si data angajării. Verificati cum a fost creat tabelul si ce date
contine.
CREATE TABLE functionar
AS SELECT cod_ang, nume, prenume, salariu, data_angajarii
FROM salariat WHERE functia = 'functionar';
DESCRIBE functionar;
SELECT * FROM functionar;
8. Adăugati o nouă coloană tabelului salariat_*** care să contină data nasterii.
ALTER TABLE salariat
ADD (datan DATE);
9. Modificati dimensiunea coloanei nume la 30 si pe cea a salariului la 12 cu 3 zecimale.
1
ALTER TABLE salariat
MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3));
10. Modificati tipul coloanei email la VARCHAR2.
ALTER TABLE salariat
MODIFY (email VARCHAR2(50));
11. Modificati valoarea implicită a coloanei data_angajarii la data sistemului + o zi.
ALTER TABLE salariat
MODIFY (data_angajarii DATE DEFAULT SYSDATE + 1);
12. Eliminati coloana varsta din tabelul salariat_***.
ALTER TABLE salariat
DROP COLUMN varsta;
13. Redenumiti tabelul functionar_*** cu funct_***.
RENAME functionar to funct;
14. Recreati tabelul functionar_*** utilizând tabelul funct_***..
CREATE TABLE functionar
AS SELECT cod_ang, nume, prenume, salariu, data_angajarii
FROM funct;
15. Eliminati tabelul funct_***.
DROP TABLE funct;
16. Stergeti si apoi creati din nou tabelul salariat_*** cu următoarea structură.
NUME TIP CONSTRÂNGERE
cod_ang NUMBER(4) Cheie primară
nume VARCHAR2(25) NOT NULL
prenume VARCHAR2(25)
data_nasterii DATE data_nasterii<data_angajarii
functia VARCHAR2(9) NOT NULL
sef NUMBER(4) Referă ca si cheie externă cod_ang
din acelasi tabel
data_angajarii DATE
email VARCHAR2(20) unic
salariu NUMBER(12,3) >0
cod_dept NUMBER(4)
cod nume prenume data_n functia sef data_ang email salariu cod_dep
20 Juridic Constanta
INSERT INTO departament VALUES (
20, 'Juridic', 'Constanta' );
INSERT INTO salariat VALUES (
3, ’N3’, ’P3 ’, ’11-06-1967’, ’JURIST ’, 2, ’’, ’E3’, 2500, 20 );
23. Stergeti departamentul 20 din tabelul departament_***. Ce observati?
DELETE FROM departament
WHERE cod_dep=20;
/*EROARE la linia 1: ORA-02292: constrângerea de integritate (SCOTT.CCE2) violata – gasita înregistrarea
copil
24. Stergeti constrângerea cce2_***. Recreati această constrângere adăugând optiunea ON DELETE
CASCADE.
ALTER TABLE salariat
DROP CONSTRAINT cce2;
ALTER TABLE salariat
ADD CONSTRAINT cce2 FOREIGN KEY (cod_dep) REFERENCES departament (cod_dep) ON DELETE
CASCADE;
25. Stergeti departamentul 20 din tabelul departament_***. Ce observati în tabelul salariat_***? Anulati
modificările.
DELETE FROM departament
WHERE cod_dep=20;
ROLLBACK;
26. Stergeti constrângerea cce2_***. Recreati această constrângere adăugând optiunea ON DELETE SET
NULL.
ALTER TABLE salariat DROP CONSTRAINT cce2;
ALTER TABLE salariat
ADD CONSTRAINT cce2
FOREIGN KEY (cod_dep)
REFERENCES departament (cod_dep)
ON DELETE SET NULL;
27. Încercati să stergeti departamentul 10 din tabelul departament_***. Ce observati?
DELETE FROM departament
WHERE cod_dep=10;
/*1 înregistrare stearsã.
Verificam continutul tabelului departament
SELECT * FROM departament;
Consultarea dictionarului datelor
Informatii despre tabelele create se găsesc în vizualizările :
4
· USER_TABLES – informatii complete despre tabelele utilizatorului curent.
· ALL_TABLES – informatii complete despre tabelele tuturor utilizatorilor.
· COLS – informatii despre coloane.
· TAB – informatii de bază despre tabelele existente în schema utilizatorului curent.
Informatii despre constrângeri găsim în :
· USER_CONSTRAINTS – informatii despre constrângerile definite de utilizatorul curent;
· ALL_CONSTRAINTS – informatii despre cosntrângerile definite de toti
7
9. Să se consulte informatii despre vizualizarea v_dept_***. Folositi vizualizarea dictionarului datelor
USER_VIEWS (coloanele VIEW_NAME si TEXT).
Obs: Coloana TEXT este de tip LONG. În cazul selectării unei coloane de tip LONG trebuie utilizată
comanda SET LONG n pentru a seta numărul de caractere afisate.
SET LONG 200
SELECT view_name, text
FROM user_views
WHERE UPPER(view_name)=UPPER(’v_dept’);
Definirea secventelor
8
d) Să se selecteze valoarea curentă a secventei.
SELECT seq_dept.CURRVAL valoare FROM DUAL;
e) Să se steargă secventa.
DROP SEQUENCE seq_dept;
Definirea indecsilor
Sintaxa comenzii CREATE INDEX:
CREATE [UNIQUE] INDEX nume_index
ON tabel (coloana1 [, coloana2…]);
Modificarea unui index se face prin comanda ALTER INDEX.
Eliminarea unui index se face prin comanda: DROP INDEX nume_index;
14. Să se creeze un index neunic, emp_last_name_idx_***, asupra coloanei last_name din tabelul emp_***.
CREATE INDEX emp_last_name_idx ON EMP (last_name);
15. Să se creeze indecsi unici asupra codului angajatului (employee_id) si asupra combinatiei last_name,
first_name, hire_date.
CREATE UNIQUE INDEX employee_id_idx ON emp (employee_id);
CREATE UNIQUE INDEX employee_id_idx1 ON emp (last_name, hire_date);
16. Creati un index neunic asupra coloanei department_id din emp_*** pentru a eficientiza joinurile dintre
acest tabel si dept_***.
CREATE INDEX emp_department_idx ON EMP(department_id);
Definirea sinonimelor
CERERI MONOTABEL
1. Analizati sintaxa simplificată a comenzii SELECT. Care dintre clauze sunt obligatorii?
SELECT { [ {DISTINCT | UNIQUE} | ALL] lista_campuri | *}
FROM [nume_schemă.]nume_obiect ]
[, [nume_schemă.]nume_obiect …]
[WHERE condiŃie_clauza_where]
[GROUP BY expresie [, expresie …]
[HAVING condiŃie_clauza_having] ]
[ORDER BY {expresie | poziŃie} [, {expresie | poziŃie} …] ]
2. Să se listeze structura tabelelor din schema HR (EMPLOYEES, DEPARTMENTS, JOB_HISTORY,
JOBS, LOCATIONS, COUNTRIES, REGIONS), observând tipurile de date ale coloanelor.
Obs: Se va utiliza comanda SQL*Plus DESCRIBE nume_tabel
9
Se creaza tabelele:
1. REGIONS TABLE – din fisierul hr_create.sql
2. COUNTRIES TABLE– din fisierul hr_create.sql
3. LOCATIONS TABLE– din fisierul hr_create.sql
4. DEPARTAMENTS TABLE– din fisierul hr_create.sql
5. JOBS TABLE– din fisierul hr_create.sql
6. EMPLOYYES TABLE– din fisierul hr_create.sql
7. JOB_HISTORY TABLE– din fisierul hr_create.sql
8. JOB_GRADES TABLE– din fisierul hr_create.sql
11
Element Semnificaie
D Numărul zilei din săptămână (duminică=1;
luni=2; …sâmbătă=6).
DD Numărul zilei din lună.
DDD Numărul zilei din an.
DY Numele zilei din săptămână, printr-o
abreviere de 3 litere (MON, THU etc.)
DAY Numele zilei din săptămână, scris în
întregime.
MM Numărul lunii din an.
MON Numele lunii din an, printr-o abreviere de 3
litere (JAN, FEB etc.)
MONTH Numele lunii din an, scris în întregime.
Y Ultima cifră din an
YY, YYY, YYYY Ultimele 2, 3, respectiv 4 cifre din an.
YEAR Anul, scris în litere (ex: two thousand
four).
HH12, HH24 Orele din zi, între 0-12, respectiv 0-24.
MI Minutele din oră.
SS Secundele din minut.
SSSSS Secundele trecute de la miezul nopŃii.
13
SELECT TO_CHAR(SYSDATE,'DAY,D,DD,DDD') FROM DUAL;
- numărul lunii din an, numele lunii cu abreviere la 3 caractere, respectiv numele complet al lunii;
SELECT TO_CHAR(SYSDATE,'MM-MON-MONTH') FROM DUAL;
- ora curentă (ora, minute, secunde).
SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') FROM DUAL;
22. Să se listeze numele departamentelor care functionează în locatia având codul 1700 si al căror manager
este cunoscut.
SELECT department_name
FROM departments
WHERE location_id=1700 AND manager_id IS NOT NULL;
23. Să se afiseze codurile departamentelor în care lucrează salariati.
SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL
ORDER BY department_id;
24. Să se afiseze numele si prenumele salariatilor angajati în luna mai 1987.
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR(hire_date, 'MON,YYYY') = 'may-1987';
Sau
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR (hire_date, 'mm-YYYY') = '05-1987';
25. Să se listeze codurile angajatilor care au avut si alte joburi fată de cel prezent. Să se ordoneze rezultatul
descrescător după codul angajatului.
SELECT department_name FROM departments
WHERE manager_id IS NOT NULL;
26. Să se afiseze numele si data angajării pentru cei care lucrează în departamentul 80 si au fost angajati în
luna martie a anului 1997.
SELECT last_name, hire_date
FROM employees
WHERE TO_CHAR(hire_date, 'MON-YYYY') = 'MAR-1987' AND department_id = 80;
27. Să se afiseze numele joburilor care permit un salariu cuprins între 8300$ si 14000$.
SELECT DISTINCT j.job_title, s.salary
FROM jobs j, employees s
WHERE j.job_id = s.job_id and salary BETWEEN 8300 AND 14000
ORDER BY salary DESC;
28. Care este grila de salarizare pentru un salariu de 10000$?
DELECT * FROM employees WHERE salary = 10000;
29. Să se listeze numele tuturor angajatilor care au 2 litere 'L' în nume si lucrează în departamentul 30 sau
managerul lor este 123.
SELECT last_name||' '||first_name "Numele si prenumele"
FROM employees
WHERE last_name LIKE '%L%L%'
AND department_id = 30 OR
manager_id = 123;
30. Să se afiseze numele, job-ul si salariul pentru toti salariatii al căror job contine sirul 'CLERK' sau
'REP' si salariul nu este egal cu 1000, 2000 sau 3000 $.
31. Să se afiseze numele, salariul si comisionul pentru toti angajatii al căror salariu este mai mare decât de
5 ori valoarea comisionului (salary*commission_pct*5).
SELECT last_name||' '||first_name "Numele si prenumele", commission_pct
FROM employees
WHERE salary > commission_pct*5;
14
Principalele functii SQL pot fi clasificate în următoarele categorii:
· Functii single-row
· Functii multiple-row (functii agregat)
Functiile single-row returnează câte o linie rezultat pentru fiecare linie a tabelului sau vizualizării
interogate. Aceste functii pot apărea în listele SELECT, clauzele WHERE, START WITH, CONNECT BY
si HAVING.
1. Analizati următoarele functii pentru prelucrarea sirurilor de caractere:
2. LOWER (expresie) - Converteste un sir de caractere la minuscule.
LOWER ('AbCdE') = 'abcde'
UPPER (expresie) - Converteste un sir de caractere
UPPER ('AbCdE') = 'ABCDE'
INITCAP (expresie) - Converteste un sir de caractere la un sir care începe cu majusculă si continuă cu
INITCAP ('AbCdE') = 'Abcde'
INITCAP (expresie) - Converteste un sir de caractere la un sir care începe cu majusculă si continuă cu minuscule.
INITCAP ('AbCdE') = 'Abcde'
SUBSTR (expresie, m[, n]) - Extrage din expresia de tip sir de caractere, n caractere începând cu pozitia m. Dacă
lipseste argumentul n, atunci extrage toate caracterele până la sfârsitul sirului. Dacă m este negativ numărătoarea
poziŃiilor începe de la sfârsitul sirului de caractere spre început.
SUBSTR ('AbCdE', 2) = 'bCdE'
SUBSTR ('AbCdE', -3,2) = 'Cd'
SUBSTR ('AbCdE', -3) = 'CdE'
LENGTH (expresie) - Returnează numărul de caractere al expresiei.
LENGTH ('AbCdE') = 5
INSTR (expresie, expr1[, m][, n]) - Returnează pozitia la care se găseste a n-a ocurentă a expresiei 'expr1' în
cadrul expresiei 'expresie', căutarea începând de la poziŃia m. Daca m sau n lipsesc, valorile implicite sunt 1
pentru ambele.
INSTR (LOWER('AbCdE aBcDe'), 'ab', 5) = 7
INSTR (LOWER('AbC aBcDe'), 'ab', 5, 2) = 0
LTRIM (expresie[, expr1]) sau RTRIM (expresie[, expr1]) - Reversul functiilor LPAD, RPAD. Trunchează
expresia RTRIM (expresie[, expr1]) caracter la stânga sau la dreapta prin eliminarea succesivă a caracterelor din
expresia expr1. Implicit, daca lipseste, expr1 = 'abcde'
RTRIM ('abcdeXXXX', 'X') = 'abcde'
LTRIM (' abcde') = 'abcde'
TRIM (LEADING | TRAILING | BOTH caractere_trim FROM expresie) - Permite eliminarea caracterelor
specificate (caractere_trim) de la începutul (leading) , sfârsitul (trailing) sau din ambele părti, dintr-o expresie
caracter data.
TRIM (LEADING 'X' FROM
'XXXabcdeXXX') = 'abcdeXXX'
TRIM (TRAILING 'X' FROM
'XXXabcdeXXX') = 'XXXabcde'
TRIM ( BOTH 'X' FROM
XXXabcdeXXX') = 'abcde'
TRIM (' abcde ') = 'abcde'
2. Să se afiseze pentru fiecare angajat din departamentul 20 un sir de caractere de forma "Functia
salariatului {prenume} {nume} este {cod functie}".
Să se afiseze prenumele cu initiala litera mare, iar numele cu litere mari (Stephen KING), iar codul functiei
să se afiseze cu litere mici.
SELECT 'Functia salariatului ' || INITCAP(first_name)||' '||UPPER(last_name) ||' este ' ||LOWER(job_id)||' .' AS
"Angajatul si codul functiei"
FROM employees
WHERE department_id = 20;
3. Să se afiseze pentru angajatul cu numele 'HIGGINS' codul, numele si codul departamentului. Cum se
scrie conditia din WHERE astfel încât să existe siguranta ca angajatul 'HIGGINS' va fi găsit oricum ar fi
fost introdus numele acestuia? Căutarea trebuie să nu fie case-sensitive, iar eventualele blank-uri care
preced sau urmează numelui trebuie ignorate.
15
SELECT employee_id, last_name, department_id
FROM employees
WHERE UPPER(TRIM(last_name)) = 'HIGGINS';
4. Să se afiseze pentru toti angajatii al căror nume se termină în 'n', codul, numele, lungimea numelui si
pozitia din nume în care apare prima data litera 'a'. Asociati aliasuri coloanelor returnate de cerere.
SELECT employee_id, last_name, LENGTH(last_name), INSTR(UPPER(last_name), 'A')
FROM employees
WHERE SUBSTR(last_name,-1)='n';
5. Analizati următoarele functii aritmetice:
ROUND (expresie [, n]) - Returnează valoarea rotunjită a expresiei până la n zecimale. Daca n este negativ sunt
rotunjite cifre din stânga virgulei. Valoarea implicită pentru n este 0.
ROUND(1.6) = 2
ROUND(1.4) = 1
ROUND (1234.56,1) = 1234.6
ROUND (1230.56, -2) = 1200
ROUND (1260.56, -2) = 1300
MOD (m,n) - Returnează restul împărtirii lui m la n.
MOD (11, 4) = MOD (11, -4) = 3
MOD(-11, 4) = MOD (-11, -4) = -3
7. Să se afiseze numele, salariul si numărul de mii al salariului rotunjit la 2 zecimale pentru cei care nu au
salariul divizibil cu 1000.
SELECT last_name, salary, ROUND(salary/1000 ,2) "MII LEI"
FROM employees
WHERE MOD(salary,1000) !=0;
8. Analizati următoarele operatii pe expresii de tip dată calendaristică:
date -/+ number - Date - Scade/Adaugă un număr de zile dintr-o / la o dată.
date1 - date2 - Number - Întoarce numărul de zile dintre două date calendaristice.
date +/- number/24 – Date - Scade/Adaugă un număr de ore la o / dintr-o dată calendaristică.
9. Să se afiseze data (luna, ziua, ora, minutul si secunda) de peste 10 zile.
SYSDATE+10
SELECT TO_CHAR(SYSDATE+30, ‘MONTH DD HH24:MM:SS’) “Data”
FROM DUAL;
10. Să se afiseze numărul de zile rămase până la sfârsitul anului. ROUND(TO_DATE(’31-DEC-2009’)-
SYSDATE)
SELECT ROUND(TO_DATE('31-DEC-2009') - SYSDATE) FROM DUAL;
11. a. Să se afiseze data de peste 12 ore. SYSDATE+12/24
SELECT SYSDATE + 12/24 FROM DUAL;
Sau
SELECT TO_CHAR(SYSDATE+12/24, ‘ DD/MM HH24:MM:SS’) “Data”
FROM DUAL;
11. b. Să se afiseze data de peste 5 minute. SYSDATE+1/288
SELECT SYSDATE + 1/288 FROM DUAL;
Sau – data, incluziv minutele si secundele
SELECT TO_CHAR(SYSDATE+1/288, ‘ DD/MM HH24:MM:SS’) “Data”
FROM DUAL;
12. Analizati următoarele functii pentru prelucrarea datelor calendaristice:
SYSDATE - Întoarce data si timpul curent
MONTHS_BETWEEN (date1, date2) - Returnează numărul de luni dintre data date1 si data date2. Rezultatul
poate fi pozitiv sau negativ după cum date1 este mai recentă sau nu fată de date2. Zecimalele reprezintă parti
dintr-o luna!
ROUND(MONTHS_BETWEEN
(SYSDATE + 31, SYSDATE)) = 1
ADD_MONTHS (date, n) - Adaugă n luni la o data specificată. Valoarea n trebuie să fie întreagă (pozitivă sau
negativă).
ADD_MONTHS (date, n)
MONTHS_BETWEEN
16
(ADD_MONTHS(SYSDATE, 3),
SYSDATE) = 3
NEXT_DAY (date, char) - Returnează data corespunzătoare primei zile a săptămânii specificate (char) care
urmează după date.
NEXT_DAY('15-dec-2006','Monday') = '18-dec-2006'
NEXT_DAY ('15-dec-2006',1) = '18-dec-2006'
13. Să se afiseze numele angajatului, data angajării si data negocierii salariului, care a avut loc în prima zi
de Luni, după 6 luni de serviciu. Etichetati această coloană “Negociere”.
NEXT_DAY(ADD_MONTHS(hire_date, 6), ‘Monday’)
SELECT last_name, hire_date,
NEXT_DAY(ADD_MONTHS(hire_date, 6), 'Luni') "Negociere"
FROM employees;
14. Pentru fiecare angajat să se afiseze numele si numărul de luni de la data angajării. Etichetati
coloana“Luni lucrate”. Să se ordoneze rezultatul după numărul de luni lucrate. Se va rotunji numărul de
luni la cel mai apropiat număr întreg.
SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”
FROM employees
ORDER BY MONTHS_BETWEEN(SYSDATE, hire_date);
SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”
FROM employees
ORDER BY “Luni lucrate”;
SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”
FROM employees
ORDER BY 2;
15. Analizati următoarele functii de conversie:
Obs. Conversiile implicite asigurate de server-ul Oracle sunt:
de la VARCHAR2 sau CHAR la NUMBER;
de la VARCHAR2 sau CHAR la DATE;
de la NUMBER la VARCHAR2 sau CHAR;
de la DATE la VARCHAR2 sau CHAR.
SELECT last_name
FROM employees
WHERE TO_CHAR(hire_date,'yyyy')=1994;
/* afiseaza o singura coloana cu numele salariatilor care au fost angajati in anul 1994*/
SELECT last_name
FROM employees
WHERE hire_date='07-IUN-1994';
/*afiseaza numele salariatilor care au fost angajati in 7 iunie 1994*/
SELECT employee_id||' '||last_name||' '||hire_date
FROM employees
WHERE department_id=10;
/* afiseaza id angajat, numele si data angajarii salariatilor din departamentul cu id 10*/
16. Să se afiseze numele si prenumele pentru toti angajatii care s-au angajat în luna mai.
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR(hire_date,'MON') = 'MAY';
sau
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR(hire_date,'mm') = 05;
18. Să se afiseze numele angajatilor si comisionul. Dacă un angajat nu câstigă comision, să se scrie “Fara
comision”. Etichetati coloana “Comision”.
NVL(TO_CHAR(commission_pct), ‘Fara comision’)
UPDATE employees SET commission_pct = NULL WHERE last_name = ' Kochhar';
SELECT last_name, NVL(TO_CHAR(commission_pct),'Fara comision') "Comision"
FROM employees;
17
19. Să se listeze numele, salariul si comisionul tuturor angajatilor al căror venit lunar depăseste 10000$.
salary * NVL(commission_pct, 0) venit_lunar
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary * NVL(commission_pct, 0) >10000;
21. Să se afiseze numele, codul functiei, salariul si o coloana care să arate salariul după mărire. Se stie că
pentru IT_PROG are loc o mărire de 10%, pentru ST_CLERK 15%, iar pentru SA_REP o mărire de
20%. Pentru ceilalti angajati nu se acordă mărire. Să se denumească coloana "Salariu revizuit".
IT_PROG >> 44
ST_CLERK >> 55
SA_REP >> 99
SELECT last_name, job_id, salary,
DECODE(job_id, ‘IT_PROG’, salary*1.1, ’ST_CLERK’, salary*1.15, ‘SA_REP’, salary*1.2, salary ) “salariu
revizuit”
FROM employees;
SELECT last_name, job_id, salary,
CASE job_id WHEN ‘IT_PROG’ THEN salary* 1.1
WHEN ’ST_CLERK’ THEN salary*1.15
WHEN ‘SA_REP’ THEN salary*1.2
ELSE salary
END “salariu revizuit”
FROM employees;
SELECT last_name, job_id, salary,
CASE WHEN job_id= ‘IT_PROG’ THEN salary* 1.1
WHEN job_id=’ST_CLERK’ THEN salary*1.15
WHEN job_id =‘SA_REP’ THEN salary*1.2
ELSE salary
END “salariu revizuit”
FROM employees;
22. Să se afiseze numele salariatului si codul departamentului în care acesta lucrează. Dacă există salariati
care nu au un cod de departament asociat, atunci pe coloana id_depratment să se afiseze: textul “fara
departament”; valoarea zero.
SELECT last_name, NVL(TO_CHAR(department_id) , 'Fara departament') "department"
FROM employees;
SELECT last_name, NVL(TO_CHAR(department_id) , 0) "department"
FROM employees;
SELECT last_name,
CASE WHEN department_id IS NULL THEN 'Fara departament'
ELSE TO_CHAR(department_id)
END "DEPARTAMENT"
FROM employees;
SELECT last_name,
CASE WHEN department_id IS NULL THEN 0
ELSE department_id
END "DEPARTAMENT"
FROM employees;
23. a. Să se afiseze numele angajatilor care nu au manager.
SELECT last_name FROM employees WHERE manager_id IS NULL;
sau
SELECT last_name||' '||first_name FROM employees WHERE manager_id IS NULL;
23.b. Să se afiseze numele angajatilor si codul managerilor lor. Pentru angajatii care nu au manager să
apară textul “nu are sef”.
SELECT last_name,
CASE WHEN manager_id IS NULL THEN 'Nu are sef'
ELSE TO_CHAR(manager_id)
18
END "manager"
FROM employees;
Sau
SELECT last_name||' '||first_name,
CASE WHEN manager_id IS NULL THEN 'Nu are sef'
ELSE TO_CHAR(manager_id)
END "manager"
FROM employees;
24. Să se afiseze numele salariatului si:
· venitul anual dacă are comision;
· salariul dacă nu are comision.
Se va utiliza functia NVL2.
Functie
NVL2 (expr1, expr2, expr3)
Explicatie
Dacă expr1 este nenulă atunci returnează expr2, altfel Returnează expr3
Exemplu
NVL2 (1, 2, 3) = 2
NVL2 (NULL, 2, 3) = 3
24. Să se afiseze numele salariatului si:
· venitul anual dacă are comision;
· salariul dacă nu are comision.
Se va utiliza functia NVL2.
/*si aici voi aduna salariul cu comisionul*/
SELECT last_name NVL2(commission_pct, salary+commission_pct, 0) "It's about money"
FROM employees;
/*nu am inteles exact ce ar trebui sa facem asa ca am pus sa afiseze si separat pe doua coloane */
SELECT last_name, NVL2(commission_pct, salary+commission_pct, 0) "astia au comision",
NVL2(commission_pct, 0, salary) "astia nu au comision"
FROM employees;
?????????
25. Să se afiseze numele salariatului, salariul si salariul revizuit astfel:
- dacă lucrează de mai mult de 200 de luni atunci salariul va fi mărit cu 20%;
- dacă lucrează de mai mult de 150 de luni, dar mai putin de 200 de luni, atunci salariul va fi mărit cu 15%;
- dacă lucrează de mai mult de 100 de luni, dar mai puŃin de 150 de luni, atunci salariul va fi mărit cu
10%;
- altfel, salariul va fi mărit cu 5%.
SELECT last_name, salary,
CASE WHEN ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 200 THEN salary*1.2
WHEN ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 150 THEN salary*1.15 WHEN
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 100 THEN salary*1.1
ELSE salary*1.05
END "SALARIU REVIZUIT"
FROM employees;
Tipuri de join:
- equijoin (se mai numeste inner join sau simple join) - compunerea a două tabele diferite după o conditie ce
contine operatorul de egalitate.
SELECT last_name, department_name, location_id, e.department_id
FROM employees e, departments d
WHERE e.department_id = d.department_id;
Obs: Numele sau alias-urile tabelelor sunt obligatorii în dreptul coloanelor care au acelasi nume
în mai multe tabele.
19
- nonequijoin - compunerea a două relatii tabele după o conditie oarecare, ce NU contine operatorul de egalitate.
SELECT last_name, salary, grade_level
FROM employees, job_grades
WHERE salary BETWEEN lowest_sal AND highest_sal;
- outerjoin - compunerea externă a două tabele diferite completând una dintre relatii cu valori NULL acolo unde
nu există în aceasta nici un tuplu ce îndeplineste conditia de corelare. Relatia completată cu valori NULL este cea
în dreptul căreia apare “(+)”. Operatorul (+) poate fi plasat în orice parte a conditiei de join, dar nu în ambele
părti. Full outer join = Left outer join UNION Right outer join.
SELECT last_name, department_name,location_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
- selfjoin - compunerea externă a unui tabel cu el însusi după o conditie dată.
SELECT sef.last_name, angajat.last_name
FROM employees sef, employees angajat
WHERE sef.employee_id = angajat.manager_id
ORDER BY sef.last_name;
20
AND s.country_id = c.country_id
AND c.region_id = r.region_id
AND e.job_id = j.job_id
AND region_name = ‘Americas’
AND job_title = ‘Programmer’;
6. Să se afiseze numele salariatilor si numele departamentelor în care lucrează. Se vor afisa si salariatii
care nu lucrează într-un departament (right outher join).
SELECT last_name, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
7. Să se afiseze numele departamentelor si numele salariatilor care lucrează în ele. Se vor afisa si
departamentele care nu au salariati (left outher join).
SELECT department_name, last_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
8. Să se afiseze numele, job-ul, numele departamentului, salariul si grila de salarizare pentru toti angajatii.
SELECT last_name, job_id, salary, department_name, grade_level
FROM employees e, departments d, job_grades
WHERE e.department_id = d.department_id
AND salary BETWEEN lowest_sal AND highest_sal;
9. Să se afiseze codul angajatului si numele acestuia, împreună cu numele si codul sefului său direct. Se vor
eticheta coloanele Ang#, Angajat, Mgr#, Manager. Să se salveze instrucsiunea într-un fisier numit p3_9.sql.
SELECT a.employee_id “Ang#”, a.last_name “Angajat”,
b.employee_id “Mgr#”, b.last_name“Manager”
FROM employees a, employees b
WHERE a.manager_id = b. employee_id;
SAVE p3_9;
10. Să se modifice p3_9.sql pentru a afisa toti salariatii, inclusiv pe cei care nu au sef.
SELECT e.employee_id Ang#, e.last_name Angajat,
e.manager_id Mgr#, m.last_name Manager
FROM employees e, employees m
WHERE e.manager_id = m.employee_id(+);
11. Să se afiseze numele salariatului si data angajării împreună cu numele si data angajării sefului direct
pentru salariatii care au fost angajati înaintea sefilor lor. Se vor eticheta coloanele Angajat, Data_ang,
Manager si Data_mgr.
SELECT e.last_name Angajat, e.hire_date Data_ang, m.last_name Manager, m.hire_date Data_mgr
FROM employees e, employees m
WHERE e.manager_id = m.employee_id AND e.hire_date<m.hire_date;
12. Pentru fiecare angajat din departamentele 20 si 30 să afiseze numele, codul departamentului si toti
colegii săi (salariatii care lucrează în acelasi departament cu el). Se vor eticheta coloanele corespunzător.
SELECT a.last_name “Angajat”, a.department_id ”Departament”, b.last_name “Coleg”
FROM employees a, employees b
WHERE a.department_id = b.department_id
AND a.employee_id <> b.employee_id
AND a.department_id IN (20,30)
ORDER BY a.last_name;
13. Să se afiseze numele si data angajării pentru salariatii care au fost angajati după Fay.
SELECT last_name, hire_date
FROM employees
WHERE hire_date > (SELECT hire_date
FROM employees
WHERE last_name = ‘Fay’);
21
Sau
SELECT a.last_name, a.hire_date
FROM employees a, employees b
WHERE UPPER(b.last_name)=’FAY’ AND a.hire_date>b.hire_date;
14. Scrieti o cerere pentru a afisa numele si salariul pentru toti colegii (din acelasi departament) lui Fay. Se
va exclude Fay.
SELECT last_name, salary
FROM employees
WHERE last_name <> ‘Fay’
AND department_id = (SELECT department_id
FROM employees
WHERE last_name = ‘Fay’);
Sau
SELECT last_name, salary
FROM employees
WHERE department_id = (SELECT department_id
FROM employees WHERE last_name = 'Fay')
AND last_name != 'Fay';
15. Să se afiseze codul departamentului, codul si numele angajatilor care lucrează în acelasi departament
cu cel putin un angajat al cărui nume contine litera “T”. Să se ordoneze după codul departamentului.
SELECT employee_id, last_name, department_id
FROM employees
WHERE department_id IN (SELECT DISTINCT department_id
FROM employees
WHERE UPPER(last_name) LIKE ‘%T%’)
ORDER BY department_id;
16. Să se afiseze numele si salariul angajatilor condusi direct de Steven King.
SELECT last_name, salary
FROM employees
WHERE manager_id = (SELECT employee_id
FROM employees
WHERE UPPER(last_name) ='KING'
AND UPPER(first_name) ='STEVEN' );
17. Să se afiseze numele si job-ul tuturor angajatilor din departamentul ‘Sales’.
SELECT last_name, job_id
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name ='Sales');
18. Să se afiseze numele angajatilor, numărul departamentului si job-ul tuturor salariatilor al căror
departament este localizat în Seattle.
SELECT last_name, job_id, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id = (SELECT location_id
FROM locations
WHERE city = ‘Seattle’));
Rezolvati această problemă utilizând join-uri.
19. Să se afle dacă există angajati care nu lucrează în departamentul ‘Sales’ si al căror salariu si comision
coincid cu salariul si comisionul unui angajat din departamentul ‘Sales’.
SELECT last_name, salary, commission_pct, department_id
FROM employees
22
WHERE (salary, commission_pct) IN (SELECT salary, commission_pct
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND department_name = ‘Sales’)
AND department_id <> (SELECT department_id
FROM departments
WHERE department_name = ‘Sales’);
20. Scrieti o cerere pentru a afisa numele, numele departamentului si salariul angajatilor care nu câstigă
comision, dar al căror manager coincide cu managerul unui angajat care câstigă comision.
SELECT last_name, department_name, salary
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.manager_id IN (SELECT DISTINCT manager_id
FROM employees
WHERE commission_pct IS NOT NULL)
AND commission_pct IS NULL;
21. Scrieti o cerere pentru a afisa angajatii care câstigă mai mult decât oricare functionar. Sortati
rezultatele după salariu, în ordine descrescătoare.
SELECT last_name, salary, job_id
FROM employees
WHERE salary > (SELECT MAX(salary)
FROM employees
WHERE job_id LIKE '%CLERK')
ORDER BY salary DESC;
22. Să se afiseze codul, numele si salariul tuturor angajatilor care câstigă mai mult decât salariul mediu.
SELECT employee_id, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary)
FROM employees);
23. Să se afiseze pentru fiecare salariat angajat în luna martie numele său, data angajării si numele jobului.
SELECT last_name, hire_date, job_title
FROM employees e, jobs j
WHERE TO_CHAR(hire_date,'MON') = 'MAR'
AND e.job_id = j.job_id;
24. Să se afiseze pentru fiecare salariat al cărui câstig total lunar este mai mare decât 12000, numele său,
câstigul total lunar si numele departamentului în care lucrează.
SELECT last_name, salary+commission_pct "castig total lunar" , department_name
FROM employees e, departments d
WHERE salary+commission_pct > 12000
AND e.department_id = d.department_id;
25. Să se afiseze pentru fiecare angajat codul său si numele joburilor sale anterioare, precum si intervalul
de timp în care a lucrat pe jobul respectiv.??
SELECT employee_id, job_id, start_date "data angaj job anterior",end_date"data final job anterior",
ROUND(MONTHS_BETWEEN(end_date, start_date)) "interval angajare"
FROM Job_history;
/* Nu stiu daca este bine
EMPLOYEE_ID JOB_ID data angaj data final interval angajare
----------- ---------- ---------- ---------- -----------------
102 IT_PROG 13-01-1993 24-07-1998 66
101 AC_ACCOUNT 21-09-1989 27-10-1993 49
101 AC_MGR 28-10-1993 15-03-1997 41
201 MK_REP 17-02-1996 19-12-1999 46
114 ST_CLERK 24-03-1998 31-12-1999 21
122 ST_CLERK 01-01-1999 31-12-1999 12
23
176 SA_REP 24-03-1998 31-12-1998 9
176 SA_MAN 01-01-1999 31-12-1999 12
200 AC_ACCOUNT 01-07-1994 31-12-1998 54
200 AD_ASST 17-09-1987 17-06-1993 69
26. Să se modifice cererea de la punctul 25 astfel încât să se afiseze si numele angajatului, respectiv codul
jobului său curent.
SELECT last_name, job_id, hire_date "data angajarii", SYSDATE "data curenta",
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) "Vechime in firma"
FROM employees;
27. Să se modifice cererea de la punctul 26 astfel încât să se afiseze si numele jobului său curent.
SELECT last_name, e.job_id, job_title, hire_date "data angajarii", SYSDATE "data curenta",
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date))||' ' ||'luni' "Vechime in firma"
FROM employees e, jobs j
WHERE e.job_id = j.job_id;
28. Să se afiseze salariatii care au acelasi manager ca si angajatul având codul 140.
SELECT first_name||' '||last_name
FROM employees
WHERE manager_id = ( SELECT manager_id FROM employees WHERE employee_id = 140);
29. Să se afiseze numele departamentelor care functionează în America.
Aceste tipuri de functii pot fi utilizate pentru a returna informatia corespunzătoare fiecăruia dintre
grupurile obtinute în urma divizării liniilor tabelului cu ajutorul clauzei GROUP BY.
Pot apărea în clauzele SELECT, ORDER BY si HAVING.
Server-ul Oracle aplică aceste functii fiecărui grup de linii si returnează un singur rezultat pentru fiecare
multime.
Exemple de functii grup: AVG, SUM, MAX, MIN, COUNT etc.
Tipurile de date ale argumentelor functiilor grup pot fi CHAR, VARCHAR2, NUMBER sau DATE.
Functiile AVG si SUM, operează numai asupra valorilor numerice. Functiile MAX si MIN pot opera
asupra valorilor numerice, caracter sau dată calendaristică.
Toate functiile grup, cu exceptia lui COUNT(*), ignoră valorile null. COUNT(expresie)
returnează numărul de linii pentru care expresia dată nu are valoarea null. FuncŃia COUNT returnează un
număr mai mare sau egal cu zero si nu întoarce niciodată valoarea null.
Când este utilizată clauza GROUP BY, server-ul sortează implicit multimea rezultată în
ordinea crescătoare a valorilor coloanelor după care se realizează gruparea.
Absenta clauzei GROUP BY conduce la aplicarea funcŃiei grup pe mulŃimea tuturor liniilor
tabelului.
În clauza GROUP BY se trec obligatoriu toate coloanele prezente în clauza SELECT, care nu sunt
argument al functiilor grup.
1. Să se afiseze cel mai mare salariu, cel mai mic salariu, suma si media salariilor tuturor angajatilor.
Etichetati coloanele Maxim, Minim, Suma, respectiv Media. Să se rotunjească rezultatele.
SELECT MIN(salary) min, MAX(salary) max, SUM(salary) suma,
ROUND(AVG(salary)) media
FROM employees;
2. Utilizând functia grup COUNT să se determine:
a. numărul total de angajati;
SELECT COUNT(*) "Total - angajati" FROM employees;
b. numărul de angajati care au manager;
SELECT COUNT(*) "angajari cu manager" FROM employees WHERE manager_id IS NOT NULL;
c. numărul de manageri.
SELECT COUNT(*) "Numar manageri" FROM employees WHERE manager_id IS NULL;
3. Să se afiseze diferenta dintre cel mai mare si cel mai mic salariu. Etichetati coloana “Diferenta”.
SELECT MAX(salary) - MIN(salary) "Diferenta" FROM employees;
24
4. Să se listeze numărul de angajati din departamentul având codul 50.
SELECT COUNT(*) "ANGAJATI - DEP_50" FROM employees WHERE department_id = 50;
5. Cati angajati din departamentul 80 câstigă comision?
SELECT COUNT(*) "ANGAJATI CU COMISION" FROM employees WHERE commission_pct IS
NOTNULL;
6. Să se selecteze valoarea medie si suma salariilor pentru toti angajatii care sunt reprezentanti de vânzări
(SA_MAN, SA_REP).
SELECT AVG(salary) media, SUM(salary)
FROM employees
GROUP BY job_id IN ( SA_MAN, SA_REP);
7. Să se selecteze data angajării primei persoane care a fost angajată de companie.
SELECT MIN(hire_date) FROM employees;
8. Să se afiseze numărul de angajati pentru fiecare job.
SELECT job_id, COUNT(employee_id) nr_angajati
FROM employees
GROUP BY job_id;
9. Să se afiseze minimul, maximul, suma si media salariilor pentru fiecare departament.
SELECT department_id, MIN(salary), MAX(salary), SUM(salary), AVG(salary)
FROM employees
GROUP BY department_id;
10. Să se afiseze codul departamentului si media salariilor pentru fiecare job din cadrul acestuia.
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id;
11. a. Să se afiseze codul departamentelor pentru care salariul minim depăseste 5000$.
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>5000;
11.b. Să se modifice cererea anterioară astfel încât să se afiseze si orasul în care functionează aceste
departamente.
SELECT department_id, MIN(salary), city
FROM employees, locations
GROUP BY department_id, city
HAVING MIN(salary) > 5000;
12. Să se obtină codul departamentelor si numărul de angajati al acestora pentru departamentele care au
cel putin 10 angajati.
SELECT department_id, COUNT(employee_id)
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id) >= 10;
13. Să se obtină codul departamentelor si suma salariilor angajatilor care lucrează în acestea, în ordine
descrescătoare după sumă. Se consideră angajatii care au comision si departamentele care au mai mult de
5 angajati.
SELECT department_id, SUM(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id
HAVING COUNT(employee_id) > 5
ORDER BY SUM(salary) DESC;
14. Să se obtină job-ul pentru care salariul mediu este minim.
SELECT job_id
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
25
GROUP BY job_id);
15. Să se afiseze cel mai mare dintre salariile medii pe departamente.
SELECT AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id);
16. a. Să se afiseze codul, numele departamentului si suma salariilor pe departamente.
SELECT d.department_id, department_name,a.suma
FROM departments d, (SELECT department_id ,SUM(salary) suma
FROM employees
GROUP BY department_id) a
WHERE d.department_id =a.department_id;
b. Dati o altă metodă de rezolvare a acestei probleme.
SELECT d.department_id, department_name, SUM(salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_id, department_name;
17. a. Scrieti o cerere pentru a afisa numele departamentului, numărul de angajati si salariul mediu pentru
angajatii din acel departament. Coloanele vor fi etichetate Departament, Nr. angajati, Salariu Mediu.
SELECT department_name “Departament”,
(SELECT COUNT(employee_id)
FROM employees
WHERE department_id = d.department_id ) ” Nr. angajati”,
(SELECT AVG(salary)
FROM employees
WHERE department_id = d.department_id) ”Salariu mediu”
FROM departments d;
b. Dati o altă metodă de rezolvare pentru problema anterioară.
SELECT department_name "Departament", COUNT(employee_id) "Nr. angajati", AVG(salary) "Salariu mediu"
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY department_name;
/* nu returneaza departmanetele care nu au angajati*/
18. Să se creeze o cerere prin care să se afiseze numărul total de angajati si, din acest total, numărul celor
care au fost angajati în 1997, 1998, 1999 si 2000. Datele vor fi afisate în forma următoare:
Total 1997 1998 1999 2000
--------------------------------------------------------------
50 10 5 25 1
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1997,1,0))
SELECT COUNT(employee_id) "Total",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1997,1,0)) "1997",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1998,1,0)) "1998",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1999,1,0)) "1999",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),2000,1,0)) "2000"
FROM employees;
/*afiseaza
Total 1997 1998 1999 2000
---------- ---------- ---------- ---------- ----------
106 28 23 18 11
CUBE grupează liniile selectate pe baza valorilor tuturor combinatiilor posibile ale expresiilor specificate si
returnează câte o linie totalizatoare pentru fiecare grup. Acest operator este folosit pentru a produce multimi de
rezultate care sunt utilizate în rapoarte. În vreme ce ROLLUP produce subtotalurile doar pentru o parte dintre
combinatiile posibile, operatorul CUBE produce subtotaluri pentru toate combinatiile posibile de grupări
specificate în clauza GROUP BY, precum si un total general.
Dacă există n coloane sau expresii în clauza GROUP BY, vor exista 2n combinatii posibile superagregat.
19. Să se afiseze codurile departamentelor în care lucrează cel putin un angajat, iar pentru fiecare dintre
acestea si pentru fiecare manager care lucrează în departamentul respectiv să se afiseze numărul de
salariati. De asemenea, să se afiseze numărul de salariati pentru fiecare departament indiferent de
manager si numărul total de angajati din companie.
SELECT department_id, manager_id, COUNT(employee_id)
FROM employees
WHERE manager_id IS NOT NULL AND department_id IS NOT NULL
GROUP BY ROLLUP (department_id, manager_id);
20. Să se afiseze codurile departamentelor în care lucrează cel putin un angajat, iar pentru fiecare dintre
acestea si pentru fiecare manager care lucrează în departamentul respectiv să se afiseze numărul de
salariati. De asemenea, să se afiseze numărul de salariati pentru fiecare departament indiferent de
manager, numărul de angajati subordonati unui manager indiferent de departament si numărul total de
angajati din companie.
SELECT department_id, manager_id, COUNT(employee_id)
FROM employees
WHERE manager_id IS NOT NULL AND department_id IS NOT NULL
GROUP BY CUBE (department_id, manager_id);
21. Pentru fiecare departament, job, respectiv an al angajării să se afiseze numărul de salariati. De
asemenea se va afisa numărul de angajati:
- pentru fiecare departament si job, indiferent de anul angajării;
- pentru fiecare departament, indiferent de job si de anul angajării;
- la nivel de companie.
Exemplu:
Să se afiseze valoarea totală a operelor de artă ale unui autor, expuse în cadrul fiecărei galerii având codul mai
mic decât 50. De asemenea, să se afiseze valoarea totală a operelor din fiecare galerie având codul mai mic decât
50, valoarea totală a operelor fiecărui autor indiferent de galerie si valoarea totală a operelor din galeriile având
codul mai mic decât 50.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);
27
22. Să se afiseze suma alocată pentru plata salariilor pe joburi (codul jobului), în cadrul departamentului
(codul departamentului). De asemenea, să se afiseze valoarea totală necesară pentru plata salariilor la nivel
de departament, valoarea totală necesară pentru plata salariilor la nivel de job, indiferent de departament
si valoarea totală necesară pentru plata salariilor la nivel de companie.
23. Functia GROUPING(expresie) întoarce:
- valoarea 0, dacă expresia a fost utilizată pentru calculul valorii agregat
- valoarea 1, dacă expresia nu a fost utilizată.
24. Să se afiseze numele departamentelor, titlurile job-urilor si valoarea medie a salariilor, pentru:
- fiecare departament si, în cadrul său pentru fiecare job;
- fiecare departament (indiferent de job);
- întreg tabelul.
De asemenea, să se afiseze si o coloană care indică intervenŃia coloanelor department_name si job_title în
obtinerea rezultatului.
SET LINESIZE 100
COLUMN job FORMAT ‘99’
COLUMN dept FORMAT ‘99’
SELECT department_name, job_title, AVG(salary) medie,
GROUPING(department_name) dept, GROUPING(job_title) job
FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
GROUP BY ROLLUP(department_name, job_title);
25. Modificati cererea anterioară astfel încât să se afiseze numele departamentelor, titlurile job-urilor si
valoarea medie a salariilor, pentru:
- fiecare departament si, în cadrul său pentru fiecare job;
- fiecare departament (indiferent de job);
- fiecare job(indiferent de departament);
- întreg tabelul.
Cum intervin coloanele în obtinerea rezultatului? Să se afiseze ’Dept’, dacă departamentul a intervenit în
agregare si ‘Job’, dacă job-ul a intervenit în agregare.
DECODE(GROUPING(department_name), 0, ‘Dept’)
28
27. Clauza GROUPING SETS. Permite obtinerea numai a anumitor grupări superagregat. Acestea pot fi
precizate prin intermediul clauzei:
GROUP BY GROUPING SETS ((expr_11, expr_12, …, expr_1n), (expr_21, expr_22, …expr_2m),
…)
28. Să se afiseze numele departamentelor, numele job-urilor, codurile managerilor angajatilor, maximul si
suma salariilor pentru:
- fiecare departament si, în cadrul său, fiecare job;
- fiecare job si, în cadrul său, pentru fiecare manager;
- întreg tabelul.
GROUPING SETS ((department_name, job_title), (job_title, e.manager_id), ());
· Comanda COMMIT permanentizează modificările care au fost realizate de tranzactia curentă (o tranzactie este
un set de comenzi LMD); comanda suprimă toate punctele intermediare definite în tranzactie si eliberează
blocările tranzactiei.
Observatie:
Sistemul realizează COMMIT implicit:
- la închiderea normală a unui client Oracle (de exemplu SQL*Plus),
- după fiecare comandă LDD (CREATE, ALTER, DROP).
· Comanda SAVEPOINT marchează un punct intermediar în procesarea tranzactiei. În acest mod este posibilă
împărtirea tranzactiei în subtranzactii.
Comanda SAVEPOINT are sintaxa:
SAVEPOINT nume_pct_intermediar;
· Comanda ROLLBACK permite renuntarea la modificările efectuate; aceasta determină încheierea tranzactiei,
anularea modificărilor asupra datelor si restaurarea stării lor precedente.
Comanda ROLLBACK are sintaxa:
ROLLBACK [TO SAVEPOINT nume_punct_salvare];
Observatii:
- sistemul realizează ROLLBACK implicit dacă se închide anormal (defectiune hardware sau software, pană de
curent etc.);
- nici o comanda LDD (CREATE, ALTER; DROP) nu poate fi anulată.
1. Ce efect are următoarea secventă de instructiuni?
CREATE TABLE dept1
AS SELECT * FROM departments;
SELECT * FROM dept1;
SAVEPOINT a;
/* punct de salvare creat*/
DELETE FROM dept1;
INSERT INTO dept1
VALUES (300,’Economic’,100,1000);
/*EROARE la linia 1:ORA-00913: prea multe valori*/
INSERT INTO dept1
VALUES (350,’Cercetare’,200,2000);
/*EROARE la linia 1:ORA-00913: prea multe valori*/
SAVEPOINT b;
/* punct de salvare creat*/
INSERT INTO dept1
VALUES (400,’Juritic’,150,3000);
29
SELECT COUNT(*)
FROM dept1;
*/ COUNT(*)
----------
0*/
ROLLBACK TO b;
/* revenire incheiata
SELECT COUNT(*)
FROM dept1;
*/COUNT(*)
----------
0*/
ROLLBACK TO a;
*/ punct de salvare creat
INSERT INTO dept1
VALUES (500,’Contabilitate’,175,1500);
*/EROARE la linia 1: ORA-00913: prea multe valori*/
COMMIT;
*/Confirmare finalizatã.*/
SELECT *
FROM dept1; */nici o înregistrare selectatã*/
Limbajul de prelucrare a datelor (DML). INSERT, UPDATE, DELETE.
1. Să se creeze tabele emp_*** si dept_***, având aceeasi structură si date ca si tabelele employees,
respectiv departments.
CREATE TABLE emp AS SELECT * FROM employees;
CREATE TABLE dept AS SELECT * FROM departments;
2. Să se selecteze toate înregistrările din cele două tabele create anterior.
SELECT * FROM emp;
SELECT * from dept;
3.Stergeti toate înregistrările din cele 2 tabele create anterior. Salvati modificările.
DELETE FROM emp;
DELETE FROM dept;
COMMIT;
4. Să se listeze structura tabelului employees si să se compare cu structura tabelului emp_***. Ce observati?
DESCRIBE employees;
DESCRIBE emp;
/*Au aceeasi structura.*/
5. Sintaxa simplificată a comenzii INSERT
- pentru inserarea unei singure linii:
INSERT INTO nume_tabel [(col1,col2,...)]
VALUES (expresie1, expresie2, ...);
- pentru inserarea liniilor rezultat ale unei comenzi SELECT:
INSERT INTO nume_tabel [(col1,col2,...)]
comanda_SELECT;
6. Să se exemplifice câteva dintre erorile care pot să apară la inserare si să se observe mesajul returnat de
sistem.
- lipsa de valori pentru coloane NOT NULL (coloana department_name este definită NOT NULL)
INSERT INTO dept (department_id, location_id)
VALUES (200, 2000);
*/EROARE la linia 1: ORA-01400: nu poate fi inserat NULL în ("SCOTT"."DEPT3"."DEPARTMENT_NAME")*/
- nepotrivirea listei de coloane cu cea de expresii
INSERT INTO dept
VALUES (200, 2000);
INSERT INTO dept(department_id, department_name,location_id)
VALUES (200, 2000);
*/EROARE la linia 2: ORA-00947: valori prea putine*/
30
- nepotrivirea tipului de date
INSERT INTO dept (department_id, location_id)
VALUES (‘D23’, 2000);
*/EROARE la linia 2: ORA-01722: numãr eronat*/
- valoare prea mare pentru coloană
INSERT INTO dept_*** (department_id, location_id)
VALUES (15000, 2000);
7. Inserati în tabelul emp_*** salariatii (din tabelul employees) al căror comision depăseste 25% din
salariu.
INSERT INTO emp
SELECT * FROM employees WHERE salary*0.25 < commission_pct ;
8. Creati tabele emp1_***, emp2_*** si emp3_*** cu aceeasi structură ca tabelul employees.
Inserati, utilizând o singură comandă INSERT, informatii din tabelul employees:
- în tabelul emp1_*** salariatii care au salariul mai mic decât 6000;
- în tabelul emp2_*** salariatii care au salariul cuprins între 6000 si 10000;
- în tabelul emp3_*** salariatii care au salariul mai mare decât 10000.
Verificati rezultatele, apoi stergeti toate înregistrările din aceste tabele.
Obs. Clauza ALL a comenzii INSERT determină evaluarea tuturor conditiilor din clauzele WHEN. Pentru
cele a căror valoare este TRUE, se inserează înregistrarea specificată în optiunea INTO corespunzătoare.
CREATE TABLE emp1_1
AS SELECT * FROM employees WHERE 1=0;
CREATE TABLE emp2_1
AS SELECT * FROM employees WHERE 1=0;
CREATE TABLE emp3_1
AS SELECT * FROM employees WHERE 1=0;
INSERT ALL
WHEN salary < =6000 THEN
INTO emp1_1
WHEN salary > = 6000 AND salary <= 10000 THEN
INTO emp2_1
ELSE
INTO emp3_1
SELECT * FROM employees;
DELETE FROM emp1_1;
DELETE FROM emp2_1;
DELETE FROM emp3_1;
COMMIT;
9. Să se creeze tabelul emp0_*** cu aceeasi structură ca tabelul employees. Inserati, utilizând o singură
comandă INSERT, informatii din tabelul employees:
- în tabelul emp0_*** salariatii care lucrează în departamentul 80;
- în tabelul emp1_*** salariatii care au salariul mai mic decât 6000 (care nu se regăsesc în tabelul
emp0_***);
- în tabelul emp2_*** salariatii care au salariul cuprins între 6000 si 10000 (care nu se regăsesc în
tabelele emp0_*** si emp1_***);
- în tabelul emp3_*** salariatii care au salariul mai mare decât 10000 (care nu se regăsesc în tabelele
emp0_***, emp1_*** si emp2_***).
Obs.
Clauza FIRST a comenzii INSERT determină inserarea corespunzătoare primei clauze WHEN a cărei
conditie este evaluată TRUE. Toate celelalte clauze WHEN sunt ignorate.
CREATE TABLE emp0_1
AS SELECT * FROM employees WHERE 1=0;
INSERT FIRST
WHEN department_id = 80 THEN
INTO emp0_1
WHEN salary <= 6000 THEN
31
INTO emp1_1
WHEN salary > = 6000 AND salary <= 10000 THEN
INTO emp2_1
ELSE
INTO emp3_1
SELECT * FROM employees;
10. Sintaxa simplificată a comenzii DELETE
DELETE FROM nume_tabel
[WHERE conditie];
11. Stergeti toate înregistrările din tabelele emp_*** si dept_***. Inserati în aceste tabele toate
înregistrările corespunzătoare din employees, respectiv departments. Permanentizati tranzactia.
DELETE FROM dept;
DELETE FROM emp;
INSERT INTO emp
SELECT * FROM employees;
INSERT INTO dept
SELECT * FROM departments;
COMMIT;
12. Stergeti angajatii care nu au comision. Anulati modificările.
DELETE FROM emp_***
WHERE commission_pct IS NULL;
ROLLBACK;
DELETE FROM emp
WHERE commission IS NULL;
ROLLBACK;
13. Eliminati departamentele care nu au nici un angajat. Anulati modificările.
DELETE FROM dept
WHERE department_id NOT IN (SELECT DISTINCT department_id
FROM emp
WHERE department_id IS NOT NULL);
ROLLBACK;
14. Eliminati angajatii care nu apartin unui departament valid. Anulati modificările.
DELETE FROM emp
WHERE department_id NOT IN (SELECT department_id
FROM dept)
OR department_id IS NULL;
ROLLBACK;
15. Sintaxa simplificată a comenzii UPDATE:
UPDATE nume_tabel [alias]
SET col1 = expr1[, col2=expr2]
[WHERE conditie];
sau
UPDATE nume_tabel [alias]
SET (col1,col2,...) = (subcerere)
[WHERE conditie];
16. Măriti salariul tuturor angajatilor din tabelul emp_*** cu 5%. Anulati modificările.
UPDATE emp
SET salary = salary * 1.05;
ROLLBACK;
17. Schimbati jobul tuturor salariatilor din departamentul 80 care au comision în 'SA_REP'. Anulati
modificările.
UPDATE emp
SET job_id = 'SA_REP'
WHERE department_id=80 AND commission_pct IS NOT NULL;
ROLLBACK;
32
UPDATE emp
SET job_id = 99
WHERE department_id=80 AND commission IS NOT NULL;
ROLLBACK;
18. Să se modifice jobul si departamentul angajatului având codul 114, astfel încât să fie la fel cu cele ale
angajatului având codul 205.
UPDATE emp
SET (job_id, department_id) = (SELECT job_id, department_id
FROM emp
WHERE employee_id = 205)
WHERE employee_id = 114;
ROLLBACK;
19. Schimbati salariul si comisionul celui mai prost plătit salariat din firmă, astfel încât să fie egale cu
salariul si comisionul directorului.
DELETE FROM emp WHERE employee_id = 123;
UPDATE emp
SET (salary, commission) = (SELECT salary, commission
FROM emp
WHERE manager_id IS NULL)
WHERE salary = (SELECT MIN(salary)
FROM emp);
ROLLBACK;
20. Pentru fiecare departament să se mărească salariul celor care au fost angajaŃi primii astfel încât să
devină media salariilor din companie.
UPDATE emp e
SET salary = (SELECT AVG(salary)
FROM emp)
WHERE hire_date = (SELECT MIN(hire_date)
FROM emp
WHERE department_id=e.department_id);
ROLLBACK;
21. Să se modifice valoarea emailului pentru angajatii care câstigă cel mai mult în departamentul în care
lucrează astfel încât acesta să devină initiala numelui concatenată cu prenumele. Dacă nu are prenume
atunci în loc de acesta apare caracterul ‘.’. Anulati modificările.
UPDATE emp
SET email = LOWER(SUBSTR(first_name,1,1)) || LOWER(NVL(last_name, '. '))
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary)
FROM emp
GROUP BY department_id);
ROLLBACK;
33
SUBIECTE BISTRITA (rezolvate de Cata, asa ca watch-out)
1. Care este forma corecta pentru a adauga constrangeri la nivel de coloana si /sau la nivel de tabel?
2. Care este comanda corecta care determina marirea salariul tuturor angajatilor din tabelul salariat
cu 5%?
UPDATE salariu
SET salariu = salariu * 1.05;
UPDATE salariat
SET salariu = salariu * 1.05;
UPDATE salariat
SET salariu = 1.05;
UPDATE salariat
SET salariu = salariu + salariu* 1.05;
SELECT nume
FROM salariat
WHERE manager IS NOT NULL;
5. Care este comanda corecta care pentru fiecare facultate, se insereaza in tabelul
SALARII(cod_fac, nr_prof, total_sal_fac) numarul de profesori si suma salariilor pe care facultatea
o plateste profesorilor sai?
INSERT TO TOTALURI
SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF ORDER BY COD_FAC;
6. Care secventa este corecta pentru a afisa citi angajati nu au o valoare introdusa pe coloana
salariu?
SELECT COUNT()
FROM salariati
WHERE SALARIU =0;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU =NULL;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NOT NULL;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NULL;
7. Care este comanda corecta care determina dublarea salariilor cu rotunjire la 2 zecimale a
angajatilor care sunt titulari?
UPDATE salariat
SET salariu=ROUND(salariu*2,2);
UPDATE salariat
SET salariu=ROUND(salariu*2)
WHERE titular =’y’;
UPDATE salariat
SET salariu=ROUND(salariu*2,2)
WHERE titular =’y’;
UPDATE salariat
SET salariu=ROUND(salariu*0.5,2)
WHERE titular =’y’;
8. Care este comanda corecta care afiseaza numele salariatilor care castiga mai mult decat salariul
mediu pe companie, in ordine crescatoare a salariului?
SELECT nume
FROM salariati
WHERE salariu >AVG(salariu);
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY salariu;
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati
ORDER BY salariu);
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY 1;
not null sir de sir caractere date, valoare numeric de sir de valoare
numeric de caractere de de maxim 20 implicita 2 caractere de implicita 0
5 maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale
10. Care este comanda corecta care sterge valoarea coloanei salariu pentru angajatii care sunt
angajati cu contract de colaborare?
DELETE salariu
FROM salariati
WHERE contract=’colaborare’;
UPDATE salariati
SET salariu IS null
WHERE contract=’colaborare’;
DROP salariu
FROM salariati
WHERE contract=’colaborare’;
UPDATE salariati
SET salariu=null
WHERE contract=’colaborare’;
11. Care este comanda incorecta care afiseaza numele, salariul si varsta pentru toti salariatii care
castiga mai mult de 1000, rezultatul fiind sortat descendent dupa salariu, iar pentru cei care au
acelasi salariu in ordine crescatoare dupa nume?
12. Actualizarile realizate asupra tabelelor de baza ale unei vizualizari se reflecta totdeauna in
vizualizare
Adevărat
Fals
13. Care este comanda corecta pentru a afisa numele, prenumele si varsta salariatilor, iar
pentru cei care au varsta necunoscuta sa apara textul “varsta necunoscuta”?
ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER COLUMN ADD Email char(25);
ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER ADD Email char(25);
not null sir de sir caractere date, valoare numeric de sir de valoare
numeric de caractere de de maxim 20 implicita 2 caractere de implicita 0
5 maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale
not null sir de sir caractere date, valoare numeric de sir de valoare
numeric de caractere de de maxim 20 implicita 2 caractere de implicita 0
5 maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale
18. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de mai jos?
not null sir de sir caractere date, valoare numeric de sir de valoare
numeric de caractere de de maxim 20 implicita 2 caractere de implicita 0
5 maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale
19. Care varianta este corecta pentru a redenumi tabelul SALARIAT cu numele
SALARIATI?
SELECT cod_departament
FROM salariat
WHERE MIN(salariu)>5000
GROUP BY cod_departament;
SELECT cod_departament
FROM salariat
GROUP BY cod_departament
HAVING MIN(salariu)>5000;
SELECT cod_departament
FROM salariat
GROUP BY cod_departament
MIN(salariu)>5000;
1. Care este forma corecta pentru a adauga constrangeri la nivel de coloana si
/sau la nivel
de tabel?
CREATE TABLE [schema.]nume_tabel (
nume_coloana tip_de_date, [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])
CREATE TABLE [schema.]nume_tabel (
nume_coloana tip_de_date [DEFAULT expr], [constrangere_de_coloana] ...
..[constrangere la nivel de tabel])
CREATE TABLE [schema.]nume_tabel (
nume_coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])
CREATE TABLE [schema.]nume_tabel (
nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])
2. Care este comanda corecta care determina marirea salariul tuturor angajatilor
din tabelul
salariat cu 5%?
UPDATE salariu
SET salariu = salariu * 1.05;
UPDATE salariat
SET salariu = salariu * 1.05;
UPDATE salariat
SET salariu = 1.05;
UPDATE salariat
SET salariu = salariu + salariu* 1.05;
3. Care este comanda corecta care insereaza in tabelul
TOTALURI(cod_departament,
numar_angajati, suma_salarii)?
INSERT INTO totaluri
SELECT cod_departament, COUNT(*),SUM(salariu)
FROM salariat
GROUP BY cod_departament;
INSERT INTO totaluri
SELECT cod_departament, SUM(cod_angajat),SUM(salariu)
FROM salariat
GROUP BY cod_departament;
INSERT INTO totaluri
SELECT cod_departament, COUNT(*),SUM(salariu)
FROM salariat;
INSERT INTO totaluri
SELECT cod_departament, COUNT(),SUM(salariu)
FROM salariat
ORDER BY cod_departament;
4. Care comanda afiseaza numele angajatilor, fara duplicate, care au manager?
SELECT DISTINCT nume
FROM salariat
WHERE manager IS NOT NULL;
SELECT DISTINCT nume
FROM salariat
WHERE manager IS NULL;
SELECT nume
FROM salariat
WHERE manager IS NOT NULL;
SELECT DISTINCT nume
FROM salariat
WHERE manager != NULL;
5. Care este comanda corecta care pentru fiecare facultate, se insereaza in
tabelul
SALARII(cod_fac, nr_prof, total_sal_fac) numarul de profesori si suma salariilor pe
care
facultatea o plateste profesorilor sai?
INSERT TO TOTALURI
SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF ORDER BY COD_FAC;
INSERT INTO TOTALURI
SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF ;
INSERT INTO TOTALURI
SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF GROUP BY COD_FAC;
INSERT INTO totaluri
SELECT COD_FAC, SUM(COD_PROF),SUM(SALARIU)
FROM PROF
GROUP BY COD_FAC;
6. Care secventa este corecta pentru a afisa citi angajati nu au o valoare
introdusa pe
coloana salariu?
SELECT COUNT()
FROM salariati
WHERE SALARIU =0;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU =NULL;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NOT NULL;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NULL;
7. Care este comanda corecta care determina dublarea salariilor cu rotunjire la 2
zecimale a
angajatilor care sunt titulari?
UPDATE salariat
SET salariu=ROUND(salariu*2,2);
UPDATE salariat
SET salariu=ROUND(salariu*2)
WHERE titular =’y’;
UPDATE salariat
SET salariu=ROUND(salariu*2,2)
WHERE titular =’y’;
UPDATE salariat
SET salariu=ROUND(salariu*0.5,2)
WHERE titular =’y’;
8. Care este comanda corecta care afiseaza numele salariatilor care castiga mai
mult decat
salariul mediu pe companie, in ordine crescatoare a salariului?
SELECT nume
FROM salariati
WHERE salariu >AVG(salariu);
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY salariu;
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati
ORDER BY salariu);
SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY 1;
9. Ce comanda modifica in tabelul SALARIAT
COD _ANG
NUME
PRENUME
DATA_ANG
VARSTA
EMAIL
SALARIU
not null
numeric de
5
sir de
caractere
de
maxim 20
sir
caractere
de maxim
20
date,
valoare
implicita
data
curentã
numeric de
2
sir de
caractere
de
dimensiune
fixa, de 30
valoare
implicita 0
numar de
10 cu 2
zecimale
dimensiunea coloanei nume la 30 si pe cea a coloanei salariu la 12 cu 3 zecimale?
ALTER TABLE salariat
MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);
ALTER TABLE salariat
MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);
ALTER TABLE salariat
MODIFY nume VARCHAR2(30), MODIFY salariu NUMBER(12,3);
ALTER TABLE salariat
MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3));
10. Care este comanda corecta care sterge valoarea coloanei salariu pentru
angajatii care
sunt angajati cu contract de colaborare?
DELETE salariu
FROM salariati
WHERE contract=’colaborare’;
UPDATE salariati
SET salariu IS null
WHERE contract=’colaborare’;
DROP salariu
FROM salariati
WHERE contract=’colaborare’;
UPDATE salariati
SET salariu=null
WHERE contract=’colaborare’;
11. Care este comanda incorecta care afiseaza numele, salariul si varsta pentru
toti salariatii
care castiga mai mult de 1000, rezultatul fiind sortat descendent dupa salariu, iar
pentru cei
care au acelasi salariu in ordine crescatoare dupa nume?
SELECT nume, salariu, varsta
FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC nume ASC;
SELECT nume, salariu, varsta
FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC, nume ASC;
SELECT nume, salariu, varsta
FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC, nume;
SELECT nume, salariu, varsta
FROM salariat
WHERE salariu>1000
ORDER BY 2 DESC, 1 ASC;
12. Actualizarile realizate asupra tabelelor de baza ale unei vizualizari se reflecta
totdeauna
in vizualizare
Adevărat
Fals
13. Care este comanda corecta pentru a afisa numele, prenumele si varsta
salariatilor, iar
pentru cei care au varsta necunoscuta sa apara textul “varsta necunoscuta”?
SE LECT nume, prenume, NVL(varsta, ‘varsta necunoscuta’)
FROM salariat;
SELECT nume, prenume, NVL(TO_CHAR(varsta), ‘varsta necunoscuta’)
FROM salariat;
SE LECT nume, prenume, NVL(CHAR(varsta), ‘varsta necunoscuta’)
FROM salariat;
SE LECT nume, prenume, NVL2(TO_CHAR(varsta), ‘varsta necunoscuta’)
FROM salariat;
14. Care comanda afiseaza numarul de angajati din fiecare departament?
SE LECT cod_departament, COUNT(*)
FROM salariat;
SE LECT cod_departament, SUM(cod_ angajat)
FROM salariat
GROUP BY cod_departament;
SELECT cod_ departament, COUNT(*)
FROM salariat
GROUP BY cod_departament;
SE LECT cod_departament, COUNT()
FROM salariat
GROUP BY cod_departament;
15. Pentru a introduce in tabelul SALARIAT
COD _ ANG
NUME
PRENUME
DATA_ ANG
VARSTA
SALARIU
not null
numeric de 5
sircaractere
de maxim 20
sir caractere
de maxim 20
date, valoare
implicita data
curentã
numeric de 2
valoare
implicita 0
numar de 10
cu 2 zecimale
doua coloane: Cod_Funct si Email ce varianta folosim?
ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER COLUMN ADD Email char(25);
ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ADD Email CHAR(25);
ALTER TABLE SALARIAT ADD (Cod_Funct NUMBER(2) , Email CHAR(25));
ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER ADD Email char(25);
16. Ce comanda creeaza tabelul SALARIAT_ 1 care sã aiba aceeiasi structura cu
tabelul SALARIAT
COD _ANG
NUME
PRENUME
DATA_ANG
VARSTA
EMAIL
SALARIU
not null
numeric de
5
sir de
caractere
de
maxim 20
sir
caractere
de maxim
20
date,
valoare
implicita
data
curentã
numeric de
2
sir de
caractere
de
dimensiune
fixa, de 30
valoare
implicita 0
numar de
10 cu 2
zecimale
si sa contina salariatii care au salariu >100?
CRE ATE TABLE SALARIAT_1
SE LECT * FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_ 1 AS
SELECT * FROM SALARIAT WHERE SALARIU>100;
CRE ATE TABLE SALARIAT_1 AS
SE LECT FROM SALARIAT WHERE SALARIU>100;
CRE ATE TABLE SALARIAT_1 AS
SE LECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100;
17. Pentru a modifica dimensiunea coloanei prenume la 30 si pe cea a salariului la
12 cu 3
zecimale, din tabelul SALARIAT
COD _ANG
NUME
PRENUME
DATA_ANG
VARSTA
EMAIL
SALARIU
not null
numeric de
5
sir de
caractere
de
maxim 20
sir
caractere
de maxim
20
date,
valoare
implicita
data
curentã
numeric de
2
sir de
caractere
de
dimensiune
fixa, de 30
valoare
implicita 0
numar de
10 cu 2
zecimale
care varienta este corecta?
ALTER TABLE SALARIAT
MODIFY (prenume VARCHAR2(30) salariu NUMBER(12,3));
ALTER TABLE SALARIAT
MODIFY (prenume VARCHAR2(30)), MODIFY(salariu NUMBE R(12,3));
ALTER TABLE SALARIAT
MODIFY (prenume VARCHAR2(30) , salariu NUMBER(12,3));
ALTER TABLE SALARIAT
ADD (prenume VARCHAR2(30), salariu NUMBER(12,3));
18. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de
mai jos?
COD _ANG
NUME
PRENUME
DATA_ANG
VARSTA
EMAIL
SALARIU
not null
numeric de
5
sir de
caractere
de
maxim 20
sir
caractere
de maxim
20
date,
valoare
implicita
data
curentã
numeric de
2
sir de
caractere
de
dimensiune
fixa, de 30
valoare
implicita 0
numar de
10 cu 2
zecimale
CREATE TABLE SALARIAT (
cod_ ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_ angajarii DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);
CRE ATE TABLE SALARIAT (
cod_ ang NUMBER(5)
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_ angajarii DATE ,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);
CRE ATE TABLE SALARIAT (
cod_ ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_ angajarii DATE, DE FAULT SYSDATE ,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2), DE FAULT 0);
19. Care varianta este corecta pentru a redenumi tabelul SALARIAT cu numele
SALARIATI?
RENAME SAL ARIAT TO SALARIATI;
RENAME SALARIAT WITH SALARIATI;
RENAME TABLE SALARIAT TO TABLE SALARIATI;
RENAME TABLE SALARIAT WITH TABLE SALARIATI;
20. Care ste comanda corecta care afiseaza codul departamentelor pentru care
salariul
minim depaseste 5000$?
SELECT cod_departament
FROM salariat
WHERE MIN(salariu)>5000
GROUP BY cod_departament;
SE LECT cod_departament
FROM salariat
GROUP BY cod_departament
HAVING MIN(salariu)>5000;
SE LECT cod_departament
FROM salariat
GROUP BY cod_departament
MIN(salariu)>5000;
ALTE SUBIECTE TIMISOARA
Care este comanda corecta care afiseaza numele si salariul angajatilor condusi
direct de
Ionescu Mihai?
SELECT nume, salariu
FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );
SELECT nume, salariu
FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu', prenume ='Mihai' );
SELECT nume, salariu
FROM salariati
WHERE cod_sef = ‘Ionescu Mihai';
SELECT nume, salariu
FROM salariati
WHERE cod_sef != (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );
Ce comanda sterge din tabelul SALARIAT
COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU
not null numeric de 5 sir de
caractere de
maxim 20 sir caractere de maxim 20 date, valoare implicita data curentã numeric
de 2 sir de
caractere de dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale
coloana nume si coloana salariu?
ALTER TABLE SALARIAT
DROP nume, salariu;
ALTER TABLE SALARIAT
DROP COLUMN (nume, salariu);
ALTER TABLE SALARIAT
DROP (nume, salariu);
ALTER TABLE SALARIAT
DROP COLUMN nume, COLUMN salariu;
Care este comanda corecta care afiseaza numele salariatilor care lucreaza in
departamentul
3 si au salariul >100 sau care sunt din departamentul 5 si au salariul <200?
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 OR salariu>100) AND (cod_deptartament=5 OR salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 AND
salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) AND (cod_deptartament=5 AND
salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 OR salariu<200);
Care dintre urmatoarele comenzi intoarce numarul zilei din luna carespunzator
datei
curente?
SELECT TO_CHAR(SYSDATE,’DDD’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’DAY’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’D’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’DD’)
FROM dual;
Care este comanda corecta care afiseaza numele salariatilor si numele
departamentelor in
care lucreaza, inclusiv departamentele in care nu lucreaza salariati?
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament = d.cod_departament;
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament(+) = d.cod_departament;
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament = d.cod_departament(+);
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament(+) = d.cod_departament(+);
Pentru a insera in tabelul SALARIAT inregistrari,
COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU
not null numeric de 5 sir caractere de maxim 20 sir caractere de maxim 20 date,
valoare
implicita data curentã numeric de 2 sir de
caractere de dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale
care varianta este incorecta?
INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,DATA_ANG,VARSTA,EMAIL, SALARIU)
VALUES(5, ‘Ene’, ‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’,
2500.50)
INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME, VARSTA, EMAIL) VALUES(5, ‘Ene’, ‘Ana’,
20,
‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’)
INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,VARSTA,EMAIL, SALARIU)
VALUES(5,
‘Ene’, ‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’)
INSERT INTO SALARIAT
VALUES(5, ‘Ene’, ‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’,
2500.50)
Ce comanda creeaza tabelul SALARIAT_1 care sã aiba aceeiasi structura cu
tabelul SALARIAT
COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU
not null numeric de 5 sir de
caractere de
maxim 20 sir caractere de maxim 20 date, valoare implicita data curentã numeric
de 2 sir de
caractere de dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale
si sa contina salariatii care au salariu >100?
CREATE TABLE SALARIAT_1
SELECT * FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT * FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100;
Care este comanda nu elimina simultan spatiile de la inceputul si sfarsitul
coloanei nume?
SELECT TRIM(nume)
FROM salariat;
SELECT RTRIM(LTRIM(nume))
FROM salariat;
SELECT LTRIM(RTRIM(nume))
FROM salariat;
SELECT LTRIM(nume)
FROM salariat;
2. Care este comanda corecta care afiseaza toate functiile pe care nu lucreaza
angazatii?
A SELECT cod_functie
FROM functii
WHERE cod_functie IN
(select cod_functie FROM salariati WHERE cod_functie IS NOT NULL)
B SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati WHERE cod_functie IS NULL)
C SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati)
D SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati WHERE cod_functie IS NOT NULL)
Raspuns D.
ALTE TESTE
3-Care este comanda corecta care afiseaza numele cititorilor care au carti nerestituite?
SELECT nume_ cititor
FROM imprumuta
WHERE data_ restituirii = NULL;
SE LECT nume_cititor
FROM imprumuta
WHERE data_ restituirii IS NOT NULL;
SELECT nume_ cititor
FROM imprumuta
WHERE data_ restituirii IS NULL;
SE LECT nume_cititor
FROM imprumuta
WHERE data_ restituirii > SYSDATE;
6-Care comanda nu defineste corect un tabel?
CREATE TABLE [schema.]nume_ tabel (
nume_coloana tip_de_date [DEFAULT expr], ...);
CREATE TABLE nume_ tabel [(col1, col2...)]
AS subcerere;
CREATE TABLE [schema.]nume_ tabel (
nume_ coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...);
CREATE TABLE [schema.]nume_ tabel (
nume_coloana tip_de_date [DEFAULT expr] [constrangere_ de_coloana], ...
..[constrangere la nivel de tabel])
8-Ce comanda creeaza corect tabelul SALARIAT, specificand constrangerile
COD _ ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU
cheie primara numeric de 5 not null
sir decaractere demaxim 20 sir caractere de maxim 20 date, valoare
implicita data curentã numeric de 2 unic sir de caractere de dimensiune fixa, de 30 > 0
numar de 10 cu 2 zecimale
coloana nume si coloana salariu?
CREATE TABLE salariat(
cod_ ang NUMBER(5) PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ ang DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(30) UNIQUE,
salariu NUMBER(10,2) CHECK (salariu > 0));
CREATE TABLE salariat(
cod_ ang NUMBER(5) PRIMARY KE Y,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ ang DATE DEFAULT SYSDATE ,
varsta NUMBER(2),
email CHAR(30) UNIQUE ,
salariu NUMBER(10,2) > 0));
CREATE TABLE salariat(
cod_ ang NUMBER(5) PRIMARY KE Y,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ ang DATE DEFAULT SYSDATE ,
varsta NUMBER(2),
email CHAR(30),
salariu NUMBER(10,2) CHECK (salariu > 0));
9-Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de
‘ENE
DAN’?
SELECT nume, salariu
FROM salariati
WHERE cod_manager = (SELE CT cod_manager FROM salariati
WHERE UPPER(nume) ='ENE ' , UPPER(pren) ='DAN' );
SE LECT nume, salariu
FROM salariati
WHERE cod_manager = (SELE CT cod_ang FROM salariati
WHERE nume ='ENE' , pren ='DAN' );
SE LECT nume, salariu
FROM salariati
(SE LECT cod_ang FROM salariati
WHERE UPPER(nume) ='ENE ' AND UPPER(pren) ='DAN' );
SELECT nume, salariu
FROM salariati
WHERE cod_manager = (SELECT cod_ ang FROM salariati
WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' );
10. Care este comanda corecta care afiseaza numarul total al cartilor imprumutate in anul
2008?
SELECT COUNT()
FROM imprumuta
WHERE TO_CHAR(data_ imprumutului,’yyyy’)=2008;
SELECT COUNT(*)
FROM imprumuta
WHERE TO_CHAR(data_ imprumutului,’yyyy’)=2008;
SE LECT COUNT(*)
FROM imprumuta
WHERE data_ imprumutului=2008;
SE LECT COUNT(*)
FROM imprumuta
WHERE TO_CHAR(data_ imprumutului,’yy’)=2008;
14-Care comanda listeaza numele tuturor angajatilor care au a treia litera din nume 'a'?
SELECT nume
FROM salariat
WHERE nume LIKE '_ _a$';
SELECT nume
FROM salariat
WHERE nume LIKE '%a%';
SELECT nume
FROM salariat
WHERE nume LIKE '__ a%';
15-Care este comanda corecta care afiseaza toate departamentele care platesc salariatilor
sai o
suma mai mare ca 20000?
SELECT nume_ departament
FROM departament
WHERE 20000<
(SE LECT sum(salariu) FROM salariat);
SE LECT nume_departament
FROM departament A
WHERE 20000<
(SE LECT sum(salariu) FROM salariat B
where cod_ departament=cod_departament);
SE LECT nume_departament
FROM departament
WHERE 20000<
(SE LECT sum(salariu) FROM salariat
where A.cod_ departament=B.cod_departament);
SELECT nume_departament
FROM departament A
WHERE 20000<
(SELECT sum(salariu) FROM salariat B
where A.cod_departament=B.cod_departament);
18-Care este comanda corecta care afiseaza codul departamentelor, numele
departamentelor si
suma salariilor pentru fiecare departament?
SELECT cod_ departament, nume_departament, SUM(salariu)
FROM salariati s, departamente d
GROUP BY cod_departament, nume_departament;
SE LECT cod_departament, nume_ departament, SUM(salariu)
FROM salariati s, departamente d
WHERE s.cod_ departament=d.cod_departament
GROUP BY cod_departament;
SELECT cod_departament, nume_departament, SUM(salariu)
FROM salariati s, departamente d
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament, nume_departament;
SE LECT cod_departament, nume_ departament, SUM(salariu)
FROM salariati, departamente
WHERE s.cod_ departament=d.cod_departament
GROUP BY cod_departament, nume_departament;
19-Care este comanda corecta care sa afiseze daca exista angajati care nu lucreaza in
departamentul ‘Contractari’ si al caror salariu coincide cu salariul unui angajat din
departamentul
‘Contractari’?
SELECT nume, salariu, cod_depart
FROM salariati
WHERE salariu IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart AND nume_depart <> ‘Contractari’)
AND cod_depart= (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);
SE LECT nume, salariu, cod_depart
FROM salariati
WHERE salariu IS IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_ depart = d.cod_ depart , nume_ depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);
SE LECT nume, salariu, cod_depart
FROM salariati
WHERE (salariu) IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_ depart = d.cod_ depart AND nume_depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);
teste fotografii care nu se regasesc mai sus
1.Care este comanda corecta care afiseaza numarul total de carti dintr-o
biblioteca pentru
fiecare domeniu:
SELECT cod_domeniu, COUNT(numar_exemplare)
FROM biblioteca
GROUP BY cod_domeniu;
SELECT cod_domeniu, SUM(numar_exemplare)
FROM biblioteca
GROUP BY cod_domeniu;
SELECT cod_domeniu, SUM(cod_carte)
FROM biblioteca
GROUP BY cod_domeniu;
SELECT cod_domeniu, COUNT(*)
FROM biblioteca
GROUP BY cod_domeniu;
2.Pentru tabelul salariat
cod_depart cod_ang# nume pren salariu cod_funct
care este comanda corecta, pentru a modifica salariul la 3000, pentru angajatii
care lucreaza
in departamentul 10 si au salariul <3000?
UPDATE salariat SET salariu=3000
WHERE cod_depart=10 AND salariu<3000;
MODIFY salariat SET salariu=3000
WHERE cod_depart=10, salariu<3000;
UPDATE salariat SET cod_depart=10 AND salariu<3000
WHERE salariu=3000;
MODIFY salariat SET salariu=3000
WHERE cod_depart=10 AND salariu<3000;
3.Care este comanda corecta care listeaza numele ale functiilor care exista in
departamentul
30, fara duplicate
SELECT DISTINCT nume_functie
FROM salariati s, functii f
WHERE cod_functie=cod_functie
AND cod_departament=30;
SELECT DISTINCT nume_functie
FROM salariati s, functii f
WHERE s.cod_functie=f.cod_functie
AND cod_departament=30;
SELECT DISTINCT nume_functie
FROM salariati, functii f
WHERE s.cod_functie=f.cod_functie
AND cod_departament=30;
SELECT nume_functie
FROM salariati s, functii f
WHERE s.cod_functie=f.cod_functie
AND cod_departament=30;
4.Care este comanda corecta care determina micsorarea salariilro cu 10%, cu
rotunjire la 2
zecimale, a angajatilor care sunt titulari
UPDATE salariat
SET salariu=ROUND(salariu*0.9,2);
UPDATE salariat
SET salariu=ROUND(salariu*1,1)
WHERE titular='N';
UPDATE salariat
SET salariu=ROUND(salariu*0.9,2)
WHERE titular='N';
UPDATE salariat
SET salariu=ROUND(salariu*0.1,2)
WHERE titular='Y';
5.O constrangere de tip PRIMARY KEY poate fi declarata numai la nivel de coloana
A/F
6.Efectele unei comenzi DDL pot fi anulate cu o comanda ROLLBACK
A/F
7.Efectele unei comenzi DML pot fi anulate cu o comanda ROLLBACK
A/F
8.Care este comanda corecta care se afiseaza numele si prenumele pentru toti
angajatii cu
varsta necunoscuta?
SELECT nume, prenume
FROM salariat
WHERE varsta=NULL;
SELECT nume, prenume
FROM salariat
WHERE varsta IS NULL;
SELECT nume, prenume
FROM salariat
WHERE varsta=0;
SELECT nume, prenume
FROM salariat
WHERE varsta IS NOT NULL;
9.Care este comanda corecta care determina micsorarea salariilro cu 10%, cu
rotunjire la 2
zecimale, a angajatilor care NU sunt titulari
UPDATE salariat
SET salariu=ROUND(salariu*0.9,2);
UPDATE salariat
SET salariu=ROUND(salariu*1,1)
WHERE titular='N';
UPDATE salariat
SET salariu=ROUND(salariu*0.9,2)
WHERE titular="N";
UPDATE salariat
SET salariu=ROUND(salariu*0.1,2)
WHERE titular='Y';
10.Pot fi eliminate mai multe coloane dintr-un tabel folosind o singura comanda
ALTER
TABLE ... DROP COLUMN
A/F
11.Care este comanda corecta care afiseaza numele si data angajarii pentru
salariatii care au
fost angajati dupa angajatul avand codul 10, in ordine descrescatoare a numelui?
SELECT nume, data_angajarii
FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10);
SELECT nume, data_angajarii
FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10)
ORDER BY nume;
SELECT nume, data_angajarii
FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10)
ORDER BY nume DESC;
SELECT nume, data_angajarii
FROM salariat
WHERE data_angajarii >
(SELECT * FROM salariat WHERE cod_angajat = 10)
ORDER BY nume DESC;
Sisteme de Gestiune a Bazelor de Date
— an3, s2, 2010 —
DECLARE
v_x NUMBER(9,2):=10;
v_y NUMBER(9,2);
v_message VARCHAR2(20);
BEGIN
A 10 v_y:= NULL; c
IF v_x !=v_y THEN
v_message := ‘ NOT EQUAL’;
ELSE v_message := ‘EQUAL’;
END IF;
DBMS_OUTPUT.PUT_LINE(v_message);
END;
c. EQUAL
Care din urmatoarele declaratii de valabilitate este corecta?
b. v_id_student NUMBER(5);
A 2 b
v_nume_student VARCHAR2(35) NOT NUL:=’Ionescu’;
v_prenume_student studenti.prenume%TYPE;
v_data DATE:=SYSDATE+1;
Care dintre urmatoarele afirmatii este corecta?
A 38 a
a. Blocul PL/SQL care descrie actiunea unui trigger nu poate contine
comanda COMIT
Care dintre urmatoarele afirmatii nu este corecta?
A 37 d
d. Un trigger la nivel de linie este executat o singura data, indiferent de
numarul de linii afectate de comanda declansatoare
1 din 29
Care dintre urmatoarele blocuri se executa cu erori?
d. DECLARE
alfa interval month;
A 14 d
BEGIN
alfa :=interval ‘8’ month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
END;
Care dintre urmatoarele variante apeleaza corect functia F_TEST care are
un singur parametru numeric?
A 28 a
a. SELECT F_TEST (80)
FROM DUAL ;
Care dintre urmatoarele vizualizari poate fi folosita în urmatoarea coman-
da pentru a vizualiza codul complet al subprogramului P1:
A 29 SELECT TEXT d
FROM ….
WHERE NAME = UPPER(’P1’);
d. USER_SOURCE
Care este varianta corecta care defineste un trigger la nivel de comanda
ce determina inserarea în tabelul audit_angajati a unui mesaj corespunza-
tor tipului de comanda LMD executata asupra tabelului angajati?
2 din 29
Care este varianta corecta de cod PL/SQL care sterge din tabelul joburi,
joburile pentru care salariul minim este 4000 sau 8200, daca aceste valori
sunt mentinute intr-un vector?
a. DECLARE
TYPE min_sal IS VARRAY(20) OF NUMBER;
A 21 a
v_min_sal min_sal:=min_sal(4000,8200);
BEGIN
FORALL i IN v_min_sal.FIRST..v_min_sal. LAST
DELETE FROM joburi
WHERE salariu_min=v_min_sal(i);
END;
Care este varianta corecta pentru a crea specificatia unui pachet, care de-
fineste un cursor pentru obtinerea datelor şi o procedura ce actualizeaza
câmpul id_job al unui angajat cu un anumit cod?
3 din 29
Care este varianta corectă pentru a defini doi vectori avand dimensiunea
maximă 3, iniţializaţi prin liste de valori, şi un al treilea, care va avea ca
elemente, produsul pe componente a celor doi vectori?
a. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
v_1 vector :=vector(1,2,3); v_2 vector :=vector(100,200,300)
v_produs vector :=vector();
BEGIN
FOR i in 1..3 LOOP
v_produs(i)* v_2(i)
END LOOP;
END
b. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
C 3 v_1 vector :=vector(1,2,3); v_2 vector :=(100,200,300) ?
v_produs vector:=vector();
BEGIN
FOR i in 1..3 LOOP
v_produs.EXTEND; v_produs(i):=v_1(i)* v_2(i);
END LOOP;
END
c. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
v_1 vector:=vector(1,2,3); v_2 vector:=vector(100,200,300)
v_produs vector:=vector();
BEGIN
FOR i in 1:3 LOOP
v_produs(i) :=v_produs(i)* v_1(i)* v_2(i)
END LOOP;
END
Care este varianta corecta pentru a defini un tablou imbricat de numere
care are ca elemente primele 10 numere naturale?
b. DECLARE
TYPE tablou IS TABLE OF NUMBER;
A 19 b
tab tablou:= tablou();
BEGIN FOR i IN 1…10 LOOP
tab.EXTEND; tab(i) := i;
END LOOP;
END;
4 din 29
Care este varianta corecta pentru afisarea variabilei v_mesaj ?
5 din 29
Care este varianta corecta prin care se afiseaza numele şi prenumele pri-
melor 5 persoane angajate în luna martie în anul 1997?
b. DECLARE
v_nume angajati.nume%TYPE; v_prenume
angajati.prenume%TYPE;
CURSOR c IS
SELECT nume, prenume FROM angajati
WHERE TO_CHAR(data_angajarii, ‘MM-YYYY’)=’03-
1997’
A 25 b
ORDER BY data_angajarii;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nume, v_prenume;
EXIT WHEN c%ROWCOUNT>5 OR c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_nume||’ ‘|| v_prenume);
END LOOP;
CLOSE c;
END;
Care este varianta corecta prin care se incarca date dintr-un cursor într-o
colectie?
b. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v_nume tip_job;
A 23 b
CURSOR c_joburi IS SELECT nume_job FROM joburi;
BEGIN
OPEN c_joburi;
FETCH c_joburi BULK COLLECT INTO v_nume;
CLOSE c_joburi;
END;
Care este varianta de bloc PL/SQL corecta pentru a mentine intr-un vec-
tor codurile angajatilor care au salariul mai mic decat 20000 şi lucreaza
în departamentul 90?
b. DECLARE
TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE;
A 20 b
v_id t_id :=t_id();
BEGIN
SELECT id_angajat BULK COLLECT INTO v_id
FROM angajati
WHERE id_departament=90 AND salariu < 20000;
END;
6 din 29
Care este varianta incorecta prin care se obtin numele şi salariul angajati-
lor care au salariul mai mic decat 2500 şi nu lucreaza în departamentul a-
vand codul 80?
a. DECLARE
v_nume angajati.nume%TYPE;
v_sal angajati.salariu%TYPE;
CURSOR c(var_sal NUMBER, var_dept NUMBER) IS
SELECT nume, salariu
FROM angajati
WHERE salariu<var_sal AND id_departament<>var_dept;
BEGIN
OPEN c(2500,80);
LOOP
FETCH c INTO v_nume, v_sal;
EXIT WHEN c%NOTFOUND; b
DBMS_OUTPUT.PUT_LINE(‘Salariatul ’||v_nume||’ are a
A 24
salariul ‘|| v_sal); ?
END LOOP;
CLOSE c;
END;
b. DECLARE
v_sal :=2500;
v_dept := 80;
BEGIN
FOR ind IN (SELECT nume, salariu
FROM angajati
WHERE salariu<var_sal AND
id_departament<>var_dept) LOOP
DBMS_OUTPUT.PUT_LINE(‘Salariatul ’||ind_nume||’ are
salariul ‘|| ind_salariu);
END LOOP;
END;
Care tabel / vizualizare poate fi folosit/folosita în urmatoarea comanda
pentru a obtine informatii despre procedurile şi functiile detinute de utili-
zatorul curent?
A 32 SELECT * d
FROM …..
WHERE OBJECT_TYPE IN (‘PROCEDURE’ , ‘FUNCTION’);
d. USER_OBJECTS
7 din 29
Ce comanda SQL*Plus ar putea sa preceada blocul de mai jos pentru ca
în acesta să se utilizeze valoarea data variabilei sem ?
DECLARE
v_sem CHAR(2):=UPPER(‘&sem’);
BEGIN
CASE v_sem a
A 15
WHEN ‘I’ THEN DBMS_OUTPUT.PUT_LINE(‘SEMESTRUL I’); ?
WHEN ‘II’ THEN DBMS_OUTPUT.PUT_LINE(‘SEMESTRUL
II’);
ELSE DBMS_OUTPUT.PUT_LINE(‘este o eroare!’);
END CASE;
END;
a. ACCEPT sem PROMPT ‘sem=’
Ce trebuie adaugat la linia 11 pentru ca în următorul bloc PL/SQL să se
foloseasca corect cursorul?
1. DECLARE
2. CURSOR c_ang IS
3. SELECT *
4. FROM angajati
5. WHERE TO_CHAR(data_angajarii,’YYYY’)=2000
A 35 6. FOR UPDATE OF salariu NOWAIT; b
7. BEGIN
8. FOR v_c_ang IN c_ang LOOP
9. UPDATE angajati
10. SET salariu=salariu+1000
11. ………………………..
12. END LOOP;
13. END;
b. WHERE CURRENT OF c_ang;
8 din 29
Ce trebuie adaugat la linia 9 pentru ca urmatoarea functie sa fie corect
creata?
9 din 29
Codul sursa de mai jos defineste un pachet cu ajutorul caruia, utilizand un
subprogram functie şi un cursor, se poate obtine salariul minim inregistrat
pentru angajati şi lista angajatilor care au salariul mai mare sau egal decat
acel minim +1000.
c. DECLARE
val_min NUMBER ;
BEGIN
val_min:=pachet_min_sal.f_min;
DBMS_OUTPUT.PUT_LINE(‘Salariul minim ’ || ’ ‘ || val_min);
FORv_cursor IN pachet_min_sal .c_ang(val_min)
DBMS_OUTPUT.PUT_LINE(v_cursor.nume||’ ‘||
v_cursor.salariu);
END;
10 din 29
Codul următor:
DECLARE
PROCEDURE p1(val NUMBER)
IS
BEGIN
UPDATE angajaţi
SET salariu=salariu+val
WHERE cod_departament=10; ?
C 1
END; c
BEGIN
p1(700);
END
B 9 SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Invat PL/SQL');
END;
/
Creaţi un bloc anonim care să afiseze propoziţia "Invat PL/SQL" pe
ecran. Varianta 1 — Afisare folosind variabile de legătură
DECLARE
v_nume, v_prenume VARCHAR2(35);
B 4
Corect:
DECLARE
v_nume VARCHAR2(35);
v_prenume VARCHAR2(35);
11 din 29
Evaluati următoarele declaratii de variabile:
DECLARE
B 5 v_nr NUMBER(5,2) = 10;
Corect:
DECLARE
v_nr NUMBER(5,2) := 10;
Evaluati următoarele declaratii de variabile:
DECLARE
B 6 v_test BOOLEAN:= SYSDATE;
Corect:
DECLARE
v_test BOOLEAN:=TRUE;
Evaluati următoarele declaratii de variabile:
DECLARE
v1 NUMBER(5) :=10;
v2 NUMBER(5) :=15;
B 7 v3 NUMBER(5) := v1< v2;
Corect:
DECLARE
v1 NUMBER(5) :=10;
v2 NUMBER(5) :=15;
v3 BOOLEAN := v1< v2;
În blocul PL/SQL de mai jos
apare:
c. un cursor implicit
Parametrii unei functii pot fi:
A 27 b
b. Numai de intrare (IN)
12 din 29
Pentru ca următorul bloc PL/SQL sa fie corect şi sa afiseze codul, salaria-
tul şi jobul angajatului cu codul 100, trebuie adaugat la linia 10 următorul
cod:
SQL> DECLARE
2 TYPE type_ang IS RECORD (
3 ang_cod angajati.id_angajat%TYPE,
4 sal angajati.salariu%TYPE,
5 job angajati.id_job%TYPE);
6 v_ang type_ang;
A 12 c
7 BEGIN
8 DELETE FROM angajati
9 WHERE id_angajat=100
10 ………………….
11 INTO v_ang;
12 DBMS_OUTPUT.PUT_LINE (‘ Angajatul cu codul :’||
v_ang.ang_cod ||
13 ‘ şi jobul ‘ || v_ang.job || ‘ are salariul ‘ || v_ang.sal);
14 END;
c. RETURNING id_angajat, salariu, id_job
Pentru ca următorul bloc PL/SQL sa fie corect trebuie adaugat la linia 8
următorul cod:
13 din 29
Pentru ca următorul bloc PL/SQL sa fie corect trebuie adaugat la linia 6
următorul cod:
1 DECLARE
2 TYPE typetablou IS TABLE OF NUMBER;
3 tablou typetablou:= typetablou();
A 13 4 BEGIN a
5 FOR i IN 1..10 LOOP
6
7 tablou(i) :=i;
8 END LOOP;
9 END;
a. tablou.EXTEND
Să se creeze tabelul test_***(cod NUMBER(4)). Să se introducă în tabe-
lul test_*** 5 înregistrări, pentru care codul va fi generat printr-un con-
tor.
DECLARE
v_contor NUMBER(6) := 1;
BEGIN
B 15 LOOP
INSERT INTO test_*** VALUES (v_contor);
v_contor := v_contor + 1;
EXIT WHEN v_contor > 5;
END LOOP;
END;
/
Să se creeze tabelul test_***(cod NUMBER(4)). Să se introducă în tabe-
lul test_*** 5 înregistrări, pentru care codul va fi generat printr-un con-
tor. Să se rezolve cerinţa folosind comanda WHILE … LOOP.
DECLARE
v_contor NUMBER(6) := 1;
BEGIN
B 16
WHILE v_contor < 6
LOOP
INSERT INTO test_*** VALUES (v_contor);
v_contor := v_contor + 1;
END LOOP;
END;
/
14 din 29
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_job jobs.job_title%TYPE;
BEGIN
B 1 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;
/
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_job jobs.job_title%TYPE;
BEGIN
B 10 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;
/
15 din 29
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_emp_hiredate employees.hire_date%TYPE;
v_emp_salary employees.salary%TYPE;
BEGIN
B 3 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 ||
' şi Salariu este: ' || v_emp_salary);
END;
/
16 din 29
Să se creeze un bloc anonim prin care în functie de abrevierea anotimpu-
rilor (P, V, T, I) introdusă de utilizator, se afisează un mesaj care specifi-
ca anotimpul respectiv.
17 din 29
Să se introducă în structura tabelului salariat_*** câmpul stea. Să se cre-
eze un bloc PL/SQL care va reactualiza acest câmp, introducând o steluţă
pentru fiecare 1000$ din valoarea salariului unui angajat al cărui cod este
specificat.
c. DECLARE
A 16 v_contor NUMBER(2) := 1; c
BEGIN
FOR i IN 1…5 LOOP
INSERT INTO testare VALUES (v_contor);
END LOOP;
END;
18 din 29
Să se rezolve problema anterioară utilizând variabile de legătură. Să se
afişeze rezultatul atât din bloc, cât şi din exteriorul acestuia.
19 din 29
Scrieţi un bloc PL/SQL în care stocaţi salariul unui angajat într-o variabi-
lă de substituţie. În partea executabilă a blocului să se calculeze salariul
anual şi bonusul pe care îl primeste salariatul (dacă salariul anual >=
20000 atunci bonusul este 2000, dacă salariul anual este cuprins între
10000 şi 20000 bonusul este 1000, iar dacă salariul anual < 10000 atunci
bonusul este 500. Să se afiseze bonusul.
20 din 29
Se dă următorul bloc PL/SQL
DECLARE
v_salariu NUMBER(8):=&p_salariu;
v_bonus NUMBER(8);
v_salariu_anual NUMBER(8);
BEGIN
v_salariu_anual:=v_salariu*12;
IF v_salariu_anual>=20000
THEN v_bonus:=0.01 * v_salariu_anual;
a
A 5 ELSIF v_salariu_anual >10000 AND v_salariu_anual <20000
?
THEN v_bonus:=0.02* v_salariu_anual;
ELSE v_bonus:=100;
END IF;
DBMS_OUTPUT.PUT_LINE(Bonusul este'|| v_bonus);
END;
DECLARE
TYPE tablou_numar IS TABLE OF NUMBER
INDEX BY PLS_INTEGER;
v_tablou tablou_numar;
BEGIN
FOR i IN 1...10 LOOP
v_tablour(i) := i*i*i;
END LOOP;
FOR i IN v_tablou.FIRST..v_tablou.LAST LOOP
A 18 v_tablour(i) := NULL; c
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘tabloul are ‘ || v_tablou.COUNT ||
‘elemente’);
v_tablou.delete;
DBMS_OUTPUT.PUT_LINE(‘tabloul are ‘ || v_tablou.COUNT ||
‘elemente’);
END;
În urma executiei blocului se obtine următorul rezultat:
DECLARE
carte VARCHAR2(20);
autor VARCHAR(15) DEFAULT 'Eminescu' ;
BEGIN
A 3 d
DBMS_OUTPUT.PUT_LINE(carte||' '||autor);
END;
22 din 29
Se dă următorul bloc PL/SQL:
DECLARE
nume VARCHAR2(15);
v_nr INTEGER;
BEGIN
SELECT LENGTH(nume) INTO v_nr
A 4 b
FROM dual;
DBMS_OUTPUT.PUT_LINE('Sirul are '||v_nr||'caractere');
END;
BEGIN
SELECT nume_job
INTO :rezultat
FROM angajat a, joburi b
WHERE a.id_job=b.id_job
A 6 AND id_angajat=100; b
DBMS_OUTPUT_LINE('Numele jobului este'|| :rezultat);
END;
23 din 29
Se dă următorul bloc PL/SQL:
DECLARE
v_cod_sal angajati.id_angajat%TYPE:= 100;
v_cod_dept angajati.id_departament%TYPE:= 10;
v_procent NUMBER(8):=20;
BEGIN
UPDATE angajati
SET id_departament = v_cod_dept,
salariu=salariu + (salariu* v_procent/100)
WHERE id_angajat = v_cod_sal;
IF SQL%ROWCOUNT = 0 THEN
A 7 d
DBMS_OUTPUT.PUT_LINE (‘Nu exista un angajat cu acest cod’);
ELSE
COMMIT;
DBMS_OUTPUT.PUT_LINE (‘Actualizare realizata’);
END IF;
END;
24 din 29
Se dă următorul bloc PL/SQL:
DECLARE
v_nume angajati.nume%TYPE;
v_data angajati.data_angajarii%TYPE;
CURSOR c IS
SELECT nume, data_angajarii
FROM angajati;
BEGIN
OPEN c;
LOOP
A 26 INSERT INTO informatii (nume_angajat, data_angajarii) a
VALUES (v_nume, v_data);
EXIT WHEN c%NOTFOUND;
END LOOP;
COMMIT;
END;
25 din 29
Se dă urmatorul bloc PL-SQL:
DECLARE
TYPE typetablou IS TABLE OF NUMBER;
tablou typetablou:=typetablou();
BEGIN
FOR; IN 1..10 LOOP
tablou(i):=i;
END LOOP;
DBMS_OUTPUT.PUT_LINE (Tabloul are’||tablou.COUNT||’elemente’);
FOR:in tablou.FIRST..tablou.LAST LOOP
tablou(i):=NULL;
END LOOP;
DBMS_OUTPUT.PUT_LINE(Tabloul are’||tablou.COUNT||’elemente’);
tablou.TRIM(tablou.COUNT);
?
C 2 DBMS_OUTPUT.PUT_LINE(Tabloul are’||tablou.COUNT||’elemente’);
c
END;
b. Nu afiseaza nimic
d. EROARE
26 din 29
Se defineste un trigger care determina inserarea unei linii în tabelul anga-
jati_log atunci cand salariul unui angajat este marit. Care dintre urmatoa-
rele variante este corecta?
Care este varianta corecta prin care se defineste un trigger care va deter-
mina incrementarea cu 1, a numarului de angajati din tabelul dept daca în
vizualizare este inserata o inregistrare, respective decrementarea cu 1 a
numarului de angajati din tabelul dept daca din vizualizare este stearsa o
A 42 inregistrare? b
27 din 29
Se presupune ca asupra tabelului angajati au fost definiti urmatorii 4
triggeri LMD:
c. Trigger1 - 0
Trigger2 - 1
Trigger3 - 3
Se presupune că într-o sală a unui muzeu pot fi expuse maximum 10 ope-
re de artă. Pentru aceasta, se creează următorul trigger:
28 din 29
Urmatoarea comanda creaza tabelul audit :
29 din 29
10. Blocul urmator afiseaza:
DECLARE
DBMS_OUTPUT.PUT_LINE(v_message);
END; c. EQUAL
14. Care dintre urmatoarele blocuri se executa cu erori?
d. declare
alfa:= interval’8’ month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
end;
28. Care dint urmat var apel corect func F_TEST care are un singur par num?
a. SELECT F_TEST (80)
FROM DUAL ;
29. Care dintre urmat vizual poate fi fol al subprogr P1: d. USER_SOURCE
9. Care este varianta corecta pentru afisarea variabilei v_mesaj ?
b. VARIABLE v_mesaj VARCHAR2 (30)
END;
3. Care este varianta corectă pentru a defini doi vectori avand dimen maximă 3
c. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
v_1 vector:=vector(1,2,3); v_2 vector:=vector(100,200,300)
v_produs vector:=vector();
BEGIN
FOR i in 1:3 LOOP
v_produs(i) :=v_produs(i)* v v 2(i)
END LOOP;
END
1. Care este varianta corecta pentru declararea urmatoarelor variabile?
v_valoare NUMBER(15) NOT NULL := 0;
v_data_achizitie DATE DEFAULT SYSDATE;
c_valoare CONSTANT NUMBER:= 1000;
v_ cod_opera opere.cod_opera%TYPE;
19. Care este var corecta pentru a defini un tablou primele 10 numere naturale?
b. DECLARE
tab.EXTEND; tab(i) := i;
END LOOP;
END;
20. Care este var de bloc PL/SQL corecta pentru a mentine angaj care
au salariul mai mic decat 20000 si lucreaza in departamentul 90?
b. DECLARE
TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE;
v_id t_id :=t_id();
BEGIN
SELECT id_angajat BULK COLLECT INTO v_id
END;
21.Care este varianta corecta de cod PL/SQL care sterge din tabelul joburi,
mentinute intr-un vector?
a. DECLARE
TYPE minsal IS VARRAY(20) OF NUMBER; v min sal min sal:=min
sal(4000,8200); BEGIN
FORALL i IN v min sal.FIRST..v min sal. LAST
DELETE FROM joburi
WHERE salariu min=v min sal(i); END;
22. Care este varianta corecta prin care se adauga in tab ang un nou camp
numit telefon de linie noua in tabel?
a. CREATE TYPE lista AS TABLE OF VARCHAR2(20);
ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel;
INSERT INTO angajati
VALUES(200,’xxx’,4000,40000,lista(0214567898,0214567899));
23. Care este varianta cor prin care se inca date dintr-un cursor intr-o colectie?
b. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v nume tip_job;
CURSOR c_joburi IS SELECT nume_job FROM joburi;
BEGIN
OPEN c_joburi;
FETCH c_joburi BULK COLLECT INTO v nume; CLOSE c_joburi; END;
34. Care este var corecta pentru a crea specif unui pachet, angajat cu un an cod?
c. CREATE OR REPLACE PACKAGE manager_pkg IS CURSOR joburicurs IS
SELECT id_angajat, id_job FROM angajati; PROCEDURE update_job(p_ang_id IN
angajati.id angajat%TYPE,
P_id_job OUT angajati.id_job%TYPE);
END manager_pkg;
24. Care este var incor prin care se obtin num si salariul angaj care au salariul
mai mic decat 2500 si nu lucreaza in departamentul avand codul 80?
b. DECLARE
v_sal :=2500;
v_dept := 80;
END LOOP;
END;
25. Care este varianta corecta prin care se afiseaza numele si prenumele primelor 5
persoane angajate in luna martie in anul 1997?
b. DECLARE
ORDER BY data_angajarii;
BEGIN
CLOSE c;
END;
37. Care dintre urmatoarele afirmatii nu este corecta?
d. Un trigger la nivel de linie este exec o singura data, indifde numa de linii afectate de
comanda declansatoare.
38. Care dintre urmatoarele afirmatii este corecta?
a. Blocul PL/SQL care descrie act unui trigger nu poate cont com COMIT.
2. Care din urmatoarele declaratii de valabilitate este corecta?
v_id_student NUMBER(5);
v_prenume_student studenti.prenume%TYPE;
v_data DATE:=SYSDATE+1;
40. Care este varianta corecta care def un trigger la niv de com tabel angajati?
c. CREATE TRIGGER trigger_audit_angajati
AFTER INSERT OR DELETE OR UPDATE ON angajati
VALUES (‘Actualizare’);
END IF;
END;
32. Care tabel/vizualizare poate fi folosit/folosita detin de utilizat curent?
SELECT *
FROM …..
WHERE OBJECT_TYPE IN (‘PROCEDURE’ , ‘FUNCTION’);
d. USER_OBJECTS
15. Ce comanda SQL*Plus ar putea sa preceada blocul de mai jos pentru ca in acesta sa
se utilizeze valoarea data variabilei sem?
DECLARE
v_sem CHAR(2):=UPPER(‘&sem’);
END CASE;
END; a. ACCEPT sem PROMPT ‘sem=’
30. Ce trebuie adaugat la linia 9 pentru ca urmat functie sa fie corect creata?
1. CREATE OR REPLACEFUNCTION nr_sal(v_dept NUMBER)
8. WHERE id_departament=v_dept;
9. ………………………………………………………..
10. END nr_sal; c. RETURN v_numar;
35. Ce treb ada la linia 11 in urma bloc PL/SQL sa se folos corect cursorul?
1 DECLARE
2 CURSOR c_ang IS
10 SET salariu=salariu+1000
11 ………………………..
12 END LOOP;
13 END; b. WHERE CURRENT OF c_ang;
33. Codul sursa de mai jos defin un pach mare sau egal decat acel min +1000.
CREATE OR REPLACE PACKAGE pachet_min_sal AS
CURSOR c_ang(nr NUMBER) RETURN angajati % ROWTYPE;
FUNCTION f_min RETURN NUMBER ;
RETURN minim;
END f_min;
END pachet_min_sal;
Care este varianta corecta de apelare pentru a obtine lista dorita?
c. DECLARE
val_min:=pachet_min_sal.f_min;
FORv_cursor IN pachet_min_sal .c_ang(val_min)
END;
36. In blocul PL/SQL de mai jos
VARIABLE rows_deleted VARCHAR(20)
DECLARE
v_dep_id angajati.id_departament%TYPE:=80;
BEGIN
:rows_deleted:=SQL%ROWCOUNT||’rows deleted’;
END;
/
PRINT rows_deleted
apare: c. un cursor implicit
11. Pentru ca urmat bloc PL/SQL sa fie corect trebuie adaug la linia 8 urmat cod:
SQL > DECLARE
2 TYPE ang_record_type IS RECORD (
3 nume VARCHAR2(20),
7 SELECT nume, id_departament
8
9 FROM angajati WHERE id_angajat = 100;
13 ang_record.departament);
14 END; d. INTO ang_record
12. Pentru ca urma bloc PL/SQL sa fie corect si sa afiseze codul, salariatul si jobul
angajatului cu codul 100, trebuie adaugat la linia 10 urmatorul cod:
SQL> DECLARE
2 TYPE type_ang IS RECORD (
3 ang_cod angajati.id_angajat%TYPE,
9 WHERE id_angajat=100
10
11 INTO v_ang;
13 ‘ si jobul ‘ || v_ang.job || ‘ are salariul ‘ || v_ang.sal);
14 END; c. RETURNING id_angajat, salariu, id_job
13. Pentru ca urmat bloc PL/SQL sa fie corect treb adau la linia 6 urmat cod:
1 DECLARE
2 TYPE typetablou IS TABLE OF NUMBER;
3 tablou typetablou:= typetablou();
6
7 tablou(i) :=i;
8 END LOOP;
9 END; a. tablou.EXTEND;
27. Parametrii unei functii pot fi:b. Numai de intrare (IN)
31. Se da functia de mai jos ,care permite de 10%.
CREATE FUNCTION impozit(p_value IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN(p_value*0.1);
END impozit;
Care este sintaxa corecta pentru a apela aceasta functie?
c. SELECT id_angajat, nume, salariu, impozit(salariu) tax
FROM angajati
WHERE id_departament=50;
3. Se da urmatorul bloc PL/SQL:
DECLARE
carte VARCHAR2(20);
autor VARCHAR(15) DEFAULT 'Eminescu' ;
DBMS_OUTPUT.PUT_LINE(carte||' '||autor);
END;
Care din urmatoarele afirmatii este corecta?
d. Blocul se executa fara erori si afiseaza 'Eminescu'
4. Se da urmatorul bloc PL/SQL:
DECLARE
nume VARCHAR2(15);
v_nr INTEGER;
DBMS_OUTPUT.PUT_LINE('Sirul are '||v_nr||'caractere');
END;
Care din urmatoarele afirmatii este adevarata?
b. Blocul se executa fara erori si afisaza 'Sirul are caractere').
5. Se da urmatorul bloc PL/SQL
DECLARE
v_salariu NUMBER(8):=&p_salariu;
v_bonus NUMBER(8);
v_salariu_anual NUMBER(8);
END IF;
DBMS_OUTPUT.PUT_LINE(Bonusul este'|| v_bonus);
END;
Care din urmatoarele afirmatii nu este corecta?
a. Blocul genereaza o eroare, deoar variab p_salariu nu este initializ.
6. Se da urmatorul bloc PL/SQL:
BEGIN
SELECT nume_job
INTO :rezultat
DBMS_OUTPUT_LINE('Numele jobului este'|| :rezultat);
END;
Care din urmatoarele afirmatii este adevarata?
b. Executia blocului se incheie cu o eroare, deoarece variabila de legatura rezultat nu
este declarata in afara blocului PL/SQL.
7. Se da urmatorul bloc PL/SQL:
DECLARE
v_cod_sal angajati.id_angajat%TYPE:= 100;
v_cod_dept angajati.id_departament%TYPE:= 10;
DBMS_OUTPUT.PUT_LINE (‘Actualizare realizata’);
END IF;
END;
Care dintre urmatoarele afirmatii este adevarata?
d. Blocul se va executa fara erori si afiseaza mesajul ‘Nu exista un angajat cu acest cod’
26. Se da urmatorul bloc PL/SQL:
DECLARE
v_nume angajati.nume%TYPE;
v_data angajati.data_angajarii%TYPE;
CURSOR c IS
EXIT WHEN c%NOTFOUND;
END LOOP;
COMMIT;
END;
Care dintre urmatoarele afirmatii este adevarata?
a. Blocul se executa fara erori, introducandu -se in tabelul informatii o linie cu toate
valorile null , respectiv toate liniile din tabelul angajati
17. Se da urmatorul bloc PL/SQL
DECLARE
TYPE tabimb IS TABLE OF VARCHAR2(50);
tab1 tabimb;
tab2 tabimb:= tabimb ();
DBMS_OUTPUT.PUT_LINE(‘tab2 este NOT NULL’);
END IF;
END;
In urma executiei acestui bloc se obtine urmatorul rezultat:
b. tab1 este NULL
tab2 este NOT NULL
18. Se da urmatorul bloc PL/SQL
DECLARE
TYPE tablou_numar IS TABLE OF NUMBER
INDEX BY PLS_INTEGER;
v_tablou tablou_numar;
DBMS_OUTPUT.PUT_LINE(‘tabloul are ‘ || v_tablou.COUNT || ‘elemente’);
END;
In urma executiei blocului se obtine urmatorul rezultat:
c. tabloul are 10 elemente
tabloul are 0 elemente
16. Sa se introduca in tab testare5 inregistrari, egale cu 1, 2, 3, 4 resp 5. Care din
urmatoarele variante nu executa acest deziderat?
c. DECLARE
BEGIN
FOR i IN 1…5 LOOP
INSERT INTO testare VALUES (v_contor);
END LOOP;
END;
41. Se defin un trigger care determina este marit. Care dintre urmat var e corecta?
a. CREATE TRIGGER trigger_salariu
AFTER UPDATE OF salariu ON angajati
FOR EACH ROW
END IF;
END;
39. Se presup ca asupra tabe angajati au fost defin urmatorii 4 triggeri LMD:
- trigger 1 de tip BEFORE INSERT la nivel de comanda;
- trigger 2 de tip BEFORE UPDATE la nivel de comanda;
- trigger 3 de tip AFTER UPDATE la nivel de linie;
- trigger 4 de tip AFTER DELETE la nivel de comanda.
O comanda UPDATE actualizeaza 3 inregistrari executii al acestuia)?
c. Trigger1 - 0 Trigger2 - 1 Trigger3 – 3
42. Se presupune ca a fost creat tabelul dept care lucreaza in acesta.
Prin comanda urmatoare se defineste vizualizarea view_angajati:
CREATE VIEW view_angajati AS
SELECT id_angajat, nume, prenume, id_departament FROM angajati;
Care este var corecta prin care se defineste un trigger stearsa o inregistrare?
b. CREATE TRIGGER trig_dept
INSTEAD OF INSERT OR DELETE ON view_angajati
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE dept SET nr_angajati = nr_angajati +1;
WHERE id_departament = :NEW.id_departament;
ELSE
UPDATE dept SET nr_angajati = nr_angajati -1;
WHERE id_departament = :OLD.id_departament;
END IF;END;
44. Se presup că într-o sală a unui muzeu 10 opere de artă. următ trigger:
CREATE TRIGGER trigger_opere
BEFORE INSERT OR UPDATE OF cod_sala ON opera
RAISE_APPLICATION_ERROR(-20000,’Prea multe opere de arta);
END IF;
END;
Care dintre urmatoarele variante este corecta?
d. Triggerul este creat fara erori la compilare, dar in cazul anumitor comenzi
LMD asupra tabelului opera va genera eroarea “table mutating”.
43. Urmatoarea comanda creaza tabelul audit:
CREATE TABLE audit
(actiune VARCHAR2(20),
Apoi, este definit urmatorul trigger:
CREATE TRIGGER trig_audit
VALUES(‘Obiect modificat’);
END;
Care dintre actiunile urmat va determina decl triggerului creat inreg in tab audit?
a. O comanda prin care se adauga o constrangere de cheie primara unui table existent.
8. Variabila g_mesaj declarata ca mai jos este:
VARIABLE g_mesaj VARCHAR2 (50)
BEGIN
:g_mesaj := ‘Invat PL/SQL;
END; c. Variabila de legatura.