Sei sulla pagina 1di 16

SECTION 1

1.1 Vocabulary: constructii procedurale, PL/SQL


1. 3GL PL/SQL
4GL SQL
Is proprietary to Oracle Corporation PL/SQL
Nonprocedural SQL
Procedural PL/SQL
Is ANSI-compliant SQL

2. Deoarece ne lasa sa folosim constructii procedurale combinate cu limbaj


sql pentru a usura crearea anumitor aplicatii.

3. Variabile, logica conditionala, iterare, bucle.

1.2 Vocabulary: Portabilitate, bloc, exceptie.


2. Aplicatia creata devine mai eficienta, putem folosi proceduri si functii,
putem folosi instructiuni repetitive.

3. PL/SQL este facut special pentru a manipula baze de date pe cand Java
poate fi folosit atat pentru utilizarea bazelor de date cat si pentru a rezolva
alte tipuri de probleme.

4. Aplicatii web, aplicatii desktop, sisteme de cautare.

1.3 Vocabulary: anonymous PL/SQL Block, functie, subprograme, compilator,


procedura.
1. DECLARE, optional, delcarari de variabile locale.
BEGIN, mandatory, inceputul sectiuni executabile.
EXCEPTION, optional, posibile exceptii si cum sa fie tratate
END, mandatory, finalul sectiunii executabile.

2. a. FAIL, trebuie sa avem cel putin un statement.


b. FAIL, nu avem BEGIN
c. FAIL, sectiunea executabila trebuie sa contina minim un statement.
d. SUCCESS

3. a. anonymous blocks.
b. Procedures, functions

4. DECLARE
temp VARCHAR2(20) := 'Hello world';
BEGIN
DBMS_OUTPUT.PUT_LINE(temp);
END;

5. DECLARE
temp VARCHAR2(50);
BEGIN
SELECT 'In six months the date will be : ' ||
TO_CHAR(ADD_MONTHS(sysdate, 6)) INTO temp FROM DUAL;
DBMS_OUTPUT.PUT_LINE( temp);
END;

SECTION 2
2.1 Vocabulary: variabile locale, parametri.
1. a. select statement
b. DECLARE
c. parameters
2. number_of_copiesPLS_INTEGER; invalid
deliver_toVARCHAR2(10) := Johnson; invalid

3. A.

5. DECLARE
country VARCHAR2(255) := 'United States of America'; --French republic,
Japan
l_e NUMBER(9);
h_e NUMBER(9);
BEGIN
SELECT lowest_elevation, highest_elevation INTO l_e, h_e FROM
wf_countries WHERE country_name = country;
DBMS_OUTPUT.PUT_LINE(l_e);
DBMS_OUTPUT.PUT_LINE(h_e);
END;

2.2 Vocabulary: literals, reserved characters, reserved words, comentari,


unitati lexicale, variable.
1. Today -- valid
Last name -- invalid, contine spatiu
today’s_date -- invalid continr '
number_of_days_in_february_this_ year -- invalid prea multe caractere
Isleap$year -- invalid contine $
#number -- invalid nu incepe cu o litera
NUMBER# -- invalid contine #
Number1to7 -- valid

2. create, table, alter, rename, row, number reserved


make, seat, web not reserved

3. SELECT -reserved word


:= -delimiter
'TEST' -literal
FALSE -literal
-- -new process comment
FROM -reserved word
/*select the country with the highest elevation */ -comment
V_test -literal
4.09 -literal

2.3 Vocabulary: NCLOB, LOB, scalar, BLOB, BFILE, reference, object, CLOB.
1. Tipurile de date ne ajuta sa stocam informatii diversificate fara a face
confuzii.
2. LOB, Scalar, or Composite
3. NUMBER, VARCHAR2, REFERENCE.
5. CLOB.
6. LOB: CLOB, BLOB, NCLOB, NCLOB.
Scalar: VARCHAR2, NUMBER, PLS_INTEGER, LONG, BOOLEAN.
Composite: BFILE, TIMESTAMP, RECORD, TABLE.

2.4 Vocabulary: Boolean, %TYPE.


1. A. a. valid
b. invalid , nu avem ghilimele.
c. invalid , o constanta trebuie initializata.
d. valid
B. DECLARE
STUDENT_NAME VARCHAR2(10) := 'Johnson';
BEGIN
DBMS_OUTPUT.PUT_LINE (STUDENT_NAME);
END;

DECLARE
stu_per_class CONSTANT NUMBER := 4;
BEGIN
DBMS_OUTPUT.PUT_LINE (stu_per_class);
END;

2. Da, variabilele au nume potrivite deoarece sunt destul de sugestive.

3. DECLARE
country_name countries.country_name%TYPE;
median_age countries.median_age%TYPE;
BEGIN
SELECT country_name, median_age INTO country_name, median_age FROM
countries WHERE country_name = 'Japan';
DBMS_OUTPUT.PUT_LINE('The median age in '|| country_name || ' is '||
median_age || '.');
END;

4. In cazul in care se schimba ceva in baza de date codul nu va trebui


schimbat. Se asemenea este posibil ca declarand manual sa nu avem exact acelasi tip
de data.

5. DECLARE
TODAY DATE := SYSDATE;
TOMORROW TODAY%TYPE;
BEGIN
TOMORROW := TODAY + 1;
DBMS_OUTPUT.PUT_LINE('Hello World');
DBMS_OUTPUT.PUT_LINE(TODAY || TOMORROW);
END;

2.5 Vocabulary: conversie explcita, conversie implicita.


1. a. '123456'
b. 579
c. Sirurile de caractere au fost luate ca fiint numere si au fost adunate
(prin conversie implicita)

2.DECLARE
x VARCHAR2(20) := 'Alex Lapusan';
BEGIN
DBMS_OUTPUT.PUT_LINE(LENGTH(x));
END;

3. DECLARE
my_date DATE := sysdate;
v_last_day DATE := LAST_DAY (my_date);
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_CHAR ( my_date, 'Month dd, yyyy'));
DBMS_OUTPUT.PUT_LINE(v_last_day);
END;

4. DECLARE
my_date DATE := sysdate + 45;
BEGIN
DBMS_OUTPUT.PUT_LINE(MONTHS_BETWEEN(my_date, sysdate ));
END;

5. a. 11
b. 11
c. Se face calculul normal, intai inmultirea dupa care adunarea.

6. true

7. Conversiile implicite nu vor face mereu ce vrem noi sa faca.

2.6 1. A. 2
B. 'Western Europe'
C. 601
D. 'Product 10012 is in stock'
E. new_locn nu exista la positia 2;

2. A. Deoarece variabila este redeclarata in blocul interior


B. deoarece la iesirea din blocul interior se revine la valoare initaiala

2.7 1. DECLARE
my_var1 countries.country_name%TYPE;
my_var2 NUMBER(4,0);
BEGIN
SELECT country_name INTO my_var1 FROM countries WHERE country_id = 421;
my_var2 := TO_NUMBER('1234');
my_var2 := TO_NUMBER(my_var2) * 2;
DBMS_OUTPUT.PUT_LINE(my_var1);
End;

SECTION 3
3.1 Vocabulary: DELETE, INSERT, MERGE, UPDATE, DML.
1. C.
2. A.

3. CREATE TABLE grocery_items (


product_id NUMBER(5) PRIMARY KEY,
brand VARCHAR2(100) NOT NULL,
description VARCHAR2(100))

4. INSERT INTO grocery_items


VALUES (110, 'Colgate', 'Toothpaste')
INSERT INTO grocery_items
VALUES (111, 'Ivory', 'Soap')
INSERT INTO grocery_items
VALUES (112, 'Heinz', 'Ketchup')

5. INSERT INTO grocery_items (product_id, brand, description)


VALUES (114, 'Pepsi', 'Soda')

6. UPDATE grocery_items
SET description = 'tomato catsup'
WHERE brand = 'Heinz'

7. INSERT INTO grocery_items (product_id, brand, description)


VALUES (115, 'Carambar', 'Candy')

8. UPDATE grocery_items
SET brand = 'Dove'
WHERE brand = 'Ivory'
9. CREATE TABLE new_items (
product_id NUMBER(5) PRIMARY KEY,
brand VARCHAR2(100) NOT NULL,
description VARCHAR2(100))

BEGIN
INSERT INTO new_items
VALUES (110, 'Colgate', 'Dental paste');
INSERT INTO new_items
VALUES (175, 'Dew', 'Soda');
INSERT INTO new_items
VALUES (275, 'Palmolive', 'Dish detergent');
END;

10. MERGE INTO grocery_items a USING new_items i ON


(a.product_id=i.product_id)
WHEN MATCHED THEN UPDATE SET a.brand=i.brand, a.description=i.description
WHEN NOT MATCHED THEN INSERT VALUES (i.product_id, i.brand, i.description)

11. 1.
12. 2.
13. A.

3.2 1. invalid, invalid, invalid, valid, invalid, valid, invalid, invalid,


invalid.
2. DECLARE
v_max_deptno departments.department_id%TYPE;
BEGIN
SELECT MAX(department_id) INTO v_max_deptno FROM departments;
DBMS_OUTPUT.PUT_LINE(v_max_deptno);
END;

5. A. CREATE TABLE emp_dup AS


SELECT * FROM employees

B. SELECT first_name, last_name


FROM employees

6. Da se poate dar nu este indicat.

3.3 Vocabulary:implicit cursor, explicit cursor, MERGE, INSERT, DELETE, UPDATE.


1. true.
2. automatic , implicit.
3. 190.
5. DECLARE
v_max_deptno new_depts.department_id%TYPE;
v_dept_name new_depts.department_name%TYPE := 'A New Department';
v_dept_id new_depts.department_id%TYPE
BEGIN
SELECT MAX(department_id) INTO v_max_deptno FROM new_depts;
v_dept_id := v_max_deptno + 10;
DBMS_OUTPUT.PUT_LINE('The maximum department id is: ' || v_max_deptno);
END;

6. DECLARE
v_max_deptno new_depts.department_id%TYPE;
v_dept_name new_depts.department_name%TYPE := 'A New Department';
v_dept_id new_depts.department_id%TYPE;
BEGIN
SELECT MAX(department_id) INTO v_max_deptno FROM new_depts;
v_dept_id := v_max_deptno + 10;
DBMS_OUTPUT.PUT_LINE('The maximum department id is: ' || v_max_deptno);
INSERT INTO new_depts (department_id, department_name) VALUES (v_dept_id ,
v_dept_name);
END;

7. DECLARE
v_max_deptno new_depts.department_id%TYPE;
v_dept_name new_depts.department_name%TYPE := 'A New Department';
v_dept_id new_depts.department_id%TYPE;
BEGIN
SELECT MAX(department_id) INTO v_max_deptno FROM new_depts;
v_dept_id := v_max_deptno + 10;
DBMS_OUTPUT.PUT_LINE('The maximum department id is: ' || v_max_deptno);
INSERT INTO new_depts (department_id, department_name) VALUES (v_dept_id ,
v_dept_name);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
END;

3.4 Vocabulary: a transaction, ROLLBACK, SAVEPOINT, END, COMMIT.


1. 2 doua inserari.
3. VALUES (100, 'Polar Bear', 'Ursus maritimus');
5. Nimic nu se va salva in baza de date.

SECTION 4
4.1 Vocabulary: conditional statment, loop, boolean expression, CASE
1. Se folosesc pentru a lua decizi bazate pe diverse conditii.
2. if, case, loop
3. if, else, elsif, then, end if.
4. if, then, end if.
5. DECLARE
a wf_countries.population%TYPE;
BEGIN
SELECT population INTO a FROM wf_countries WHERE country_id = 91;
IF a > 1000000000 THEN
DBMS_OUTPUT.PUT_LINE('Populatie mai mare de 1000000000');
ELSE
DBMS_OUTPUT.PUT_LINE('Populatie mai mare de 1000000000');
END IF;
END;

6. DECLARE
a wf_countries.population%TYPE;
BEGIN
SELECT population INTO a FROM wf_countries WHERE country_id = 91;
CASE
WHEN a > 1000000000 THEN DBMS_OUTPUT.PUT_LINE('Populatie mai mare de
1000000000');
WHEN a > 0 THEN DBMS_OUTPUT.PUT_LINE('Populatie mai mica de 1000000000');
WHEN a = 0 THEN DBMS_OUTPUT.PUT_LINE('Populatie egala cu 0');
ELSE DBMS_OUTPUT.PUT_LINE('Populatie nula');
END CASE;
END;

7. The two numbers are not equal.

8. DECLARE
YR NUMBER(6,2) := 900;
BEGIN
IF (MOD(YR,4) = 0) AND (MOD(YR,100) != 0) OR (MOD(YR,400)=0) THEN
DBMS_OUTPUT.PUT_LINE(YR || 'IS A LEAP YEAR');
ELSE
DBMS_OUTPUT.PUT_LINE(YR || 'IS NOT A LEAP YEAR');
END IF;
END;

4.2 1. DECLARE
v_country_name wf_countries.country_name%TYPE := '<country_name>';
v_airports wf_countries.airports%TYPE;
BEGIN
SELECT airports INTO v_airports FROM wf_countries WHERE country_name =
v_country_name;
CASE
WHEN v_airports > 0 AND v_airports <= 100 THEN DBMS_OUTPUT.PUT_LINE
( 'There are 100 or fewer airports.' );
WHEN v_airports > 100 AND v_airports <= 1000 THEN DBMS_OUTPUT.PUT_LINE
( 'There are between 101 and 1000 airports.' );
WHEN v_airports > 1000 AND v_airports <= 10000 THEN DBMS_OUTPUT.PUT_LINE
( 'There are between 1001 and 10000 airports.' );
WHEN v_airports > 10000 THEN DBMS_OUTPUT.PUT_LINE ( 'There are more than
10000 airports.' );
ELSE DBMS_OUTPUT.PUT_LINE ( 'The number of airports is not available for
this country.' );
END CASE;
END;

2.DECLARE
v_country_name wf_countries.country_name%TYPE := 'Japan';
v_coastline wf_countries.coastline %TYPE;
v_coastline_description VARCHAR2(50);
BEGIN
SELECT coastline INTO v_coastline FROM wf_countries WHERE country_name =
v_country_name;
v_coastline_description := CASE
WHEN v_coastline = 0 THEN 'no coastline'
WHEN v_coastline < 1000 THEN 'a small coastline'
WHEN v_coastline < 10000 THEN 'a mid-range coastline'
ELSE 'a large coastline'
END;
DBMS_OUTPUT.PUT_LINE('Country ' || v_country_name || ' has ' ||
v_coastline_description);
END;

4.3 Vocabulary: loop body, end loop.


1. Executarea repetata a unei secvente de cod.

2. Basic loop statement


For loop statement
While loop statement

3. END LOOP.

4. DECLARE
v_country_id countries.country_id%TYPE;
v_country_name countries.country_name%TYPE;
iterator countries.country_id%TYPE := 1;
BEGIN
LOOP
SELECT country_id, country_name INTO v_country_id, v_country_name FROM
countries WHERE country_id = iterator;
DBMS_OUTPUT.PUT_LINE (v_country_id || ' ' || v_country_name);
IF iterator > 3 THEN EXIT;
END IF;
iterator := iterator + 1;
END LOOP;
END;

6. DECLARE
iterator NUMBER(2);
BEGIN
LOOP
IF(iterator != 6 AND iterator != 8) THEN INSERT INTO messages VALUES
(iterator);
END IF;
IF iterator > 10 THEN EXIT;
END IF;
iterator := iterator + 1;
END LOOP;
END;

4.4 Vocabulary: WHILE, FOR.


1. DECLARE
v_country_id wf_countries.country_id%TYPE;
v_country_name wf_countries.country_name%TYPE;
iterator countries.country_id%TYPE := 51;
BEGIN
WHILE iterator < 56 LOOP
SELECT country_id, country_name INTO v_country_id, v_country_name FROM
wf_countries WHERE country_id = iterator;
DBMS_OUTPUT.PUT_LINE (v_country_id || ' ' || v_country_name);
iterator := iterator + 1;
END LOOP;
END

2. DECLARE
v_country_id wf_countries.country_id%TYPE;
v_country_name wf_countries.country_name%TYPE;
BEGIN
FOR iterator in 51..56 LOOP
SELECT country_id, country_name INTO v_country_id, v_country_name FROM
wf_countries WHERE country_id = iterator;
DBMS_OUTPUT.PUT_LINE (v_country_id || ' ' || v_country_name);
END LOOP;
END;

4.5. 1. BEGIN
FOR v_out IN 60..65 LOOP
FOR v_inn IN 100..110 LOOP
DBMS_OUTPUT.PUT_LINE(v_out||'-'||v_inn);
END LOOP;
END LOOP;
END;

2. DECLARE
v_sum NUMBER(5);
BEGIN
FOR v_licenta IN 60..65 LOOP
FOR v_licentav IN 100..110 LOOP
v_sum:=v_licenta+v_licentav;
DBMS_OUTPUT.PUT_LINE(v_licenta ||'-'|| v_licentav|| '=' ||v_sum);
END LOOP; EXIT WHEN v_sum>172;
END LOOP;
END;

SECTION 5.
5.1:
Vocabulary:
1. Explicit cursor
2. Cursor
3. CLOSE
4. Context area
5. Implicit cursor
6. Open
7. FETCH
8. Active set
Try it/Solve it:
1.Cel implicit ii declarat singur de capu lui, pe cand ala explicit se
declara de programator
2.Un select care returneaza un singur rand
3.
Cand vrei sa faci o afisare a tuturor randurilor returnate
Cand vrei sa prelucrezi aceste date
4.
A-F:
DECLARE
CURSOR currencies_cur IS
SELECT currency_code, currency_name FROM wf_currencies
ORDER BY currency_name ;
v_currency_code wf_currencies.currency_code%TYPE;
v_currency_name wf_currencies.currency_name%TYPE;
BEGIN
OPEN currencies_cur;
LOOP
FETCH currencies_cur INTO v_currency_code, v_currency_name;
EXIT WHEN currencies_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( v_currency_name || ' ' || v_currency_code);
END LOOP;
CLOSE currencies_cur;
END;
G.
DECLARE
CURSOR countries_cur IS
SELECT country_name, national_holiday_date, national_holiday_name FROM
wf_countries
WHERE region_id = 5 AND national_holiday_date IS NOT NULL;
v_country_name wf_countries.country_name%TYPE;
v_national_holiday_date wf_countries.national_holiday_date%TYPE;
v_national_holiday_name wf_countries.national_holiday_name%TYPE;
BEGIN
OPEN countries_cur;
LOOP
FETCH countries_cur INTO v_country_name, v_national_holiday_date,
v_national_holiday_name;
EXIT WHEN countries_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( v_country_name || ' ' || v_national_holiday_date ||
' ' || v_national_holiday_name);
END LOOP;
CLOSE countries_cur;
END;
5. Sa aiba un nume sugestiv, sa se inchida dupa folosire, sa se deschida
inainte de folosire.
6.
DECLARE
CURSOR regions_cur IS
SELECT region_name FROM wf_world_regions
GROUP BY region_name
HAVING COUNT(REGION_ID)>10;
v_region_name wf_world_regions.region_name%TYPE;
BEGIN
OPEN regions_cur;
LOOP
FETCH regions_cur INTO v_region_name;
EXIT WHEN regions_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( v_region_name);
END LOOP;
CLOSE regions_cur;
END;

5.2:
Vocabulary:
1. %ROWTYPE atributa
2. Record
3. %ISOPEN
4. %ROWCOUNT
5. %FOUND/%NOTFOUND
Try it/Solve it:
1.
Nu trebuie sa declaram o variabila si putem controla cate randuri sa
procesam
2.
DECLARE
CURSOR countries_cur IS
SELECT country_name, national_holiday_date, national_holiday_name FROM
wf_countries
WHERE region_id = 5 AND national_holiday_date IS NOT NULL;
r countries_cur%ROWTYPE;
BEGIN
OPEN countries_cur;
LOOP
FETCH countries_cur INTO r;
EXIT WHEN countries_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( r.country_name || ' ' || r.national_holiday_date ||
' ' || r.national_holiday_name);
END LOOP;
CLOSE countries_cur;
END;
3.
DECLARE
CURSOR employees_cur IS
SELECT * FROM employees
ORDER BY SALARY DESC;
r employees_cur%ROWTYPE;
BEGIN
OPEN employees_cur;
LOOP
FETCH employees_cur INTO r;
EXIT WHEN employees_cur%ROWCOUNT>=6 OR employees_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( r.salary || ' ' || r.first_name|| ' ' ||
r.last_name);
END LOOP;
CLOSE employees_cur;
END;
4.Suntem mai smart decat oracle
5.Facut deja copile
5.3:
Vocabulary:
1. FOR CURSOR
Try it/Solve it:
1. Nu mai trebuie sa declari nicio variabila de tip record; codul este mai
scurt;
2.
DECLARE
CURSOR countries_cur IS
SELECT country_name, national_holiday_name, national_holiday_date
FROM wf_countries
WHERE region_id = 5;
BEGIN
FOR countries_rec IN countries_cur LOOP
DBMS_OUTPUT.PUT_LINE ('Country: ' || countries_rec.country_name
|| ' National holiday: '|| countries_rec.national_holiday_name
|| ', held on: '|| countries_rec.national_holiday_date);
END LOOP;
END;
3.
DECLARE
BEGIN
FOR countries_rec IN (SELECT country_name, national_holiday_name,
national_holiday_date
FROM wf_countries
WHERE region_id = 5) LOOP
DBMS_OUTPUT.PUT_LINE ('Country: ' || countries_rec.country_name
|| ' National holiday: '|| countries_rec.national_holiday_name
|| ', held on: '|| countries_rec.national_holiday_date);
END LOOP;
END;
4.

BEGIN
FOR countries_rec IN (SELECT country_name, highest_elevation, climate
FROM wf_countries
WHERE highest_elevation > 8000) LOOP
DBMS_OUTPUT.PUT_LINE ('Country: ' || countries_rec.country_name
|| ' Highest elevation: '|| countries_rec.highest_elevation
|| ', climate: '|| countries_rec.climate);
END LOOP;
END;
5.
DECLARE
CURSOR curs IS (SELECT c.country_name, COUNT(l.language_id)
FROM wf_spoken_languages l LEFT OUTER JOIN wf_countries c
ON(l.country_id = c.country_id)
GROUP BY c.COUNTRY_NAME
HAVING COUNT(L.LANGUAGE_ID)>6);
var NUMBER(3) ;
BEGIN
FOR countries_rec IN curs LOOP
DBMS_OUTPUT.PUT_LINE ('Country: ' || countries_rec.country_name);
var := curs%ROWCOUNT;
END LOOP;
DBMS_OUTPUT.PUT_LINE ( var );
END;

5.4.
1. Folosirea cursorului cu parametri ofera o universalitate codului.

2. DECLARE
CURSOR countries_cur ( v_region_id NUMBER) IS SELECT country_name, area
FROM wf_countries WHERE region_id = v_region_id;
c_record countries_cur%ROWTYPE;
BEGIN
OPEN countries_cur(5);
LOOP
FETCH countries_cur INTO c_record;
EXIT WHEN countries_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( c_record.country_name || ' ' || c_record.area);
END LOOP;
CLOSE countries_cur;
END;

3. DECLARE
CURSOR countries_cur ( v_region_id NUMBER) IS SELECT country_name, area
FROM wf_countries WHERE region_id = v_region_id;
BEGIN
FOR countries_rec IN countries_cur (5) LOOP
DBMS_OUTPUT.PUT_LINE ( countries_rec.country_name || ' ' ||
countries_rec.area);
END LOOP;
END;

4. DECLARE
CURSOR countries_cur ( v_region_id NUMBER , v_area NUMBER) IS SELECT
country_name, area FROM wf_countries WHERE region_id = v_region_id AND area >
v_area;
BEGIN
FOR countries_rec IN countries_cur (5, 200000) LOOP
DBMS_OUTPUT.PUT_LINE ( countries_rec.country_name || ' ' ||
countries_rec.area);
END LOOP;
END;

5.5. Vocabulary: FOR UPDATE, NOWAIT


1.DECLARE
CURSOR empcur(p_sal NUMBER) IS SELECT employee_id, department_id, salary
FROM employees WHERE salary < p_sal FOR UPDATE NOWAIT;
v_emp_rec empcur%ROWTYPE;
BEGIN
FOR v_emp_rec IN empcur(5000) LOOP
INSERT INTO proposed_raises(date_proposed, date_approved, employee_id,
department_id,
original_salary, proposed_new_salary )
VALUES(SYSDATE, NULL, v_emp_rec.employee_id, v_emp_rec.department_id,
v_emp_rec.salary, v_emp_rec.salary*1.05 );
END LOOP;
END;

3.DECLARE
CURSOR empcur IS SELECT date_approved FROM proposed_raises FOR UPDATE
NOWAIT;
v_emp_rec empcur%ROWTYPE;
BEGIN
OPEN empcur;
LOOP
FETCH empcur INTO v_emp_rec;
EXIT WHEN empcur%NOTFOUND;
UPDATE proposed_raises SET date_approved =SYSDATE
WHERE CURRENT OF empcur;
END LOOP;
CLOSE empcur;
END;

5.6.
1. DECLARE
CURSOR dep_cur IS SELECT * FROM departments ORDER BY department_id;
CURSOR emp_cur (p_depid number) IS SELECT * FROM employees WHERE
department_id=p_depid ORDER BY last_name;
v_dep_rec dep_cur%rowtype;
v_emp_rec emp_cur%rowtype;
BEGIN
OPEN dep_cur;
LOOP
FETCH dep_cur INTO v_dep_rec;
EXIT WHEN dep_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_dep_rec.department_id || ' ' ||
v_dep_rec.department_name);
DBMS_OUTPUT.PUT_LINE('-------------------');
OPEN emp_cur(v_dep_rec.department_id);
LOOP
FETCH emp_cur INTO v_emp_rec;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_rec.first_name || ' ' ||
v_emp_rec.last_name || ' ' || v_emp_rec.salary);
END LOOP;
CLOSE emp_cur;
DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
CLOSE dep_cur;
END;

2. declare
cursor cur_reg is
select * from wf_world_regions order by region_name;
cursor cur_coun (p_regid number) is
select * from wf_countries where region_id=p_regid order by
country_name;
v_reg_rec cur_reg%rowtype;
v_coun_rec cur_coun%rowtype;

begin
open cur_reg;
loop
fetch cur_reg into v_reg_rec;
exit when cur_reg%notfound;
if v_reg_rec.region_name like '%America%' then
dbms_output.put_line(v_reg_rec.region_id || ' ' ||
v_reg_rec.region_name);
dbms_output.put_line('-------------------');
open cur_coun(v_reg_rec.region_id);
loop
fetch cur_coun into v_coun_rec;
exit when cur_coun%notfound;
dbms_output.put_line(v_coun_rec.country_name || ' ' ||
v_coun_rec.area || ' ' ||v_coun_rec.population);
end loop;
close cur_coun;
dbms_output.put_line(' ');
end if;
end loop;
close cur_reg;
end;

SECTION 6.
6.1 Vocabulary: %ROWTYPE

1. DECLARE
TYPE depart_info_type IS RECORD
(dept_id departments.department_id%TYPE,
dept_name departments.department_name%TYPE,
mgr_id departments.manager_id%TYPE,
loc_id departments.location_id%TYPE);

v_dep_record depart_info_type;

BEGIN
SELECT department_id, department_name, manager_id, location_id
INTO v_dep_record
FROM departments
WHERE department_id=80;
DBMS_OUTPUT.PUT_LINE(v_dep_record.dept_id || ' ' || v_dep_record.dept_name||
' ' || v_dep_record.mgr_id || ' ' || v_dep_record.loc_id);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('This department does not exist');
END;

6.2 Vocabulary: COLLECTION, INDEX BY TABLE, INDEX BY table record


1. A)O colectie este un tip de variabila compusa care contine acelasi tip de
data .

B. 1) 3)

C.INDEX BY table- contine doar un sigur camp identificat dupa o cheie


primara, in timp ce o baza dedate contine absolut toate informatiile;

D. INDEX BY table are un tip de data scalar, in timp ce INDEX BY table


record, are ca tip de data %ROWTYPE;

E.t_pops este un tip de data iar v_pops_tab este o instanta a acelui tip de
data.
2. A. DECLARE
TYPE t_country_name IS TABLE OF WF_countries.country_name%TYPE
INDEX BY BINARY_INTEGER;
v_country_name_tab t_country_name ;
BEGIN
FOR count_rec IN (SELECT country_id,country_name FROM wf_countries WHERE
region_id=5 ORDER BY country_id) LOOP
v_country_name_tab(count_rec.country_id) := count_rec.country_name;
END LOOP;
END;

B. DECLARE
TYPE t_country_name IS TABLE OF WF_countries.country_name%TYPE
INDEX BY BINARY_INTEGER;
v_country_name_tab t_country_name ;
BEGIN
FOR count_rec IN (SELECT country_id,country_name FROM wf_countries WHERE
region_id=5 ORDER BY country_id) LOOP
v_country_name_tab(count_rec.country_id):=count_rec.country_name;
END LOOP;

FOR i IN v_country_name_tab.FIRST..v_country_name_tab.LAST LOOP


IF(v_country_name_tab.EXISTS(i)) THEN
DBMS_OUTPUT.PUT_LINE(v_country_name_tab(i));
END IF;
END LOOP;
END;

C. DECLARE
TYPE t_country_name IS TABLE OF WF_countries.country_name%TYPE
INDEX BY BINARY_INTEGER;
v_country_name_tab t_country_name ;
BEGIN
FOR count_rec IN (SELECT country_id,country_name FROM wf_countries WHERE
region_id=5 ORDER BY country_id) LOOP
v_country_name_tab(count_rec.country_id):=count_rec.country_name;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_country_name_tab(v_country_name_tab.FIRST)||' |
'||v_country_name_tab(v_country_name_tab.LAST)||' | '||v_country_name_tab.COUNT);
END;

2. DECLARE
CURSOR cur_emp is
SELECT employee_id,last_name,job_id,salary FROM employees;

TYPE t_emp_rec IS TABLE OF CUR_EMP%ROWTYPE


INDEX BY BINARY_INTEGER;
v_emp_rec_tab t_emp_rec;
BEGIN
FOR emp_rec IN (SELECT employee_id,last_name,job_id,salary FROM employees
ORDER BY employee_id) LOOP
v_emp_rec_tab(emp_rec.employee_id):=emp_rec;
END LOOP;
END;

Potrebbero piacerti anche