Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.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.
DECLARE
stu_per_class CONSTANT NUMBER := 4;
BEGIN
DBMS_OUTPUT.PUT_LINE (stu_per_class);
END;
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;
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.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
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.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.
6. UPDATE grocery_items
SET description = 'tomato catsup'
WHERE brand = 'Heinz'
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;
11. 1.
12. 2.
13. A.
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;
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;
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;
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;
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;
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;
B. 1) 3)
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;
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;