Sunteți pe pagina 1din 5

Probleme de rezolvat Seciunea 1 i Seciunea 2

S1L3 EE

Scriei i executai un bloc anonim n care:


declarai o variabil de tip DATE creia i atribuii ca valoare, data de peste 6 luni.
afiai mesajul In six months, the date will be: <inserai data> Folosii funcia
ADD_MONTHS

DECLARE
V_DATA DATE:=ADD_MONTHS(SYSDATE,6);
BEGIN
DBMS_OUTPUT.PUT_LINE ('DATA PESTE 6 LUNI:'||V_DATA);
END;

S2L1 E4

A. Creai urmtoarea funcie

CREATE FUNCTION num_characters (p_string IN VARCHAR2)


RETURN INTEGER AS
v_num_characters INTEGER;
BEGIN
SELECT LENGTH(p_string) INTO v_num_characters
FROM dual;
RETURN v_num_characters;
END;

B. Creai i executai urmtorul bloc anonim:

DECLARE
v_length_of_string INTEGER;
BEGIN
v_length_of_string := num_characters('Oracle Corporation');
DBMS_OUTPUT.PUT_LINE(v_length_of_string);
END;

S2L1 E5

Scriei un bloc anonim care folosete numele unei ri (country_name) ca valoare de intrare i
afieaz cea mai mare i cea mai mic nlime (highest_elevation i lowest_elevation) pentru ara
respectiv. Folosii tabela countries. Executai blocul de 3 ori pentru rile: United States of
America, French Republic i Japan.

1
se definesc 3 variabile: una pentru numele rii care poate fi iniializat cu numele primei
ri, una pentru cea mai mic nlime i una pentru cea mai mare nlime;
se scrie instruciunea SELECT care selecteaz cele dou nlimi pentru ara definit;
se afieaz mesajul cu cele dou nlimi obinute;

DECLARE
V_TARA COUNTRIES.COUNTRY_NAME%TYPE:='Japan";
V_HE COUNTRIES.HIGHEST_ELEVATION%TYPE;
V_LE COUNTRIES.LOWEST_ELEVATION%TYPE;
BEGIN
SELECT HIGHEST_ELEVATION,LOWEST_ELEVATION INTO V_HE,V_LE
FROM COUNTRIES WHERE COUNTRY_NAME=V_TARA;
DBMS_OUTPUT.PUT_LINE('HE ESTE:'||V_HE);
DBMS_OUTPUT.PUT_LINE('LE ESTE:'||V_LE);
END;

S2L4 E5

Creai urmtorul bloc anonim:

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
END;

A. Adugai la blocul de mai sus declaraiile urmtoarelor variabile:


o variabil numit TODAY de tip DATE. Iniializai-o cu data curent (SYSDATE)
o variabil numit TOMORROW cu acelaii tip ca variabila TODAY. Folosii atributul
%TYPE.

B. n seciunea executabil atribuii variabilei TOMORROW data de mine folosind o


expresie care calculeaz data de mine (adugai 1 la variabila TODAY). Afiai valorile
variabilelor TODAY i TOMORROW dup mesajul Hello World.
DECLARE
V_TODAY DATE:=SYSDATE;
V_TOMORROW V_TODAY%TYPE;
BEGIN
V_TOMORROW:=V_TODAY+1;
DBMS_OUTPUT.PUT_LINE('HELLO WORLD: '||V_TODAY);
DBMS_OUTPUT.PUT_LINE('HELLO WORLD: '||V_TOMORROW);
END;

SAU

DECLARE
V_TODAY DATE:=SYSDATE;
V_TOMORROW V_TODAY%TYPE;
BEGIN
V_TOMORROW:=V_TODAY+1;
DBMS_OUTPUT.PUT_LINE('HELLO WORLD: '||V_TOMORROW);
END;

2
S2L5 E1
Ce va afia urmtorul cod?

DECLARE
x VARCHAR2(20);
BEGIN
x:= '123' + '456' ;
DBMS_OUTPUT.PUT_LINE(x);
END;

Executai codul de mai sus i explicai rezultatul.

S2L5 E2
Scriei un bloc anonim care atribuie numele vostru complet unei variabile i afieaz numrul
total de caractere ale acestuia.

S2L5 E3
Scriei un bloc anonim care afieaz data curent n formatul Month dd, yyyy. Memorai data
ntr-o variabil de tip DATE cu identificatorul my_date. Definii o alt variabil tot de tip DATE
cu identificatorul v_last_day. Atribuii variabilei v_last_day ultima zi a lunii curente. Afiai
valoarea variabilei v_last_day.

S2L5 E4
Modificai programul creat la exerciiul S2L5 E3 prin adugarea a 45 de zile la data curent i
apoi calculai i afiai numrul de luni dintre cele dou date. Folosii funcia
MONTHS_BETWEEN.

S2L5 E6
Ce va afia urmtorul cod? Explicai rspunsul.

DECLARE
v_number NUMBER;
v_boolean BOOLEAN;
BEGIN
v_number := 25;
v_boolean := NOT(v_number > 30);
END;

Executai codul i verificati-v raspunsul.

S2L6 E1
Determinai valorile variabilelor din urmtorul cod conform domeniului i vizibilitii acestora:

DECLARE
weight NUMBER(3) := 600;
message VARCHAR2(255) := 'Product 10012';
BEGIN

3
DECLARE
weight NUMBER(3) := 1;
message VARCHAR2(255) := 'Product 11001';
new_locn VARCHAR2(50) := 'Europe';
BEGIN
weight := weight + 1;
new_locn := 'Western ' || new_locn;
-- Position 1 --
END;
weight := weight + 1;
message := message || ' is in stock';
-- Position 2 --
END;

A. Valoarea variabilei weight la poziia 1 este:

B. Valoarea variabilei new_locn la poziia 1este:

C. Valoarea pentru weight la poziia 2 este:

D.valoarea variabilei message la poziia 2 este:

E. Valoarea variabilei new_locn la poziia 2 este:

Completai codul i executai-l astfel nct s putei verifica rspunsurile.

S2L6 E2
Introducei i executai urmtorul bloc PL/SQL care conine blocuri imbricate. Rspundei la
ntrebri.

DECLARE
v_employee_id employees.employee_id%TYPE;
v_job employees.job_id%TYPE;
BEGIN
SELECT employee_id, job_id INTO v_employee_id, v_job
FROM employees
WHERE employee_id = 100;
DECLARE
v_employee_id employees.employee_id%TYPE;
v_job employees.job_id%TYPE;
BEGIN
SELECT employee_id, job_id INTO v_employee_id, v_job
FROM employees
WHERE employee_id = 103;
DBMS_OUTPUT.PUT_LINE(v_employee_id|| ' is a '||v_job);
END;
DBMS_OUTPUT.PUT_LINE(v_employee_id|| ' is a '||v_job);
END;

A. De ce blocul interior afieaz pentru job_id valoarea 103 i nu 100?

4
B. De ce blocul exterior afieaz pentru job_id valoarea 100 i nu 103?

C. Modificai codul pentru a afia id-ul angajatului 100 n blocul interior. Folosii
etichetele pentru blocuri.

S2L7 E1
Executai codul de mai jos. Se va executa corect dac l-ai introdus corect, dar conine cteva
nclcri ale bunelor practici n programare.

DECLARE
myvar1 VARCHAR2(20);
myvar2 number(4);
BEGIN
SELECT country_name INTO myvar1
FROM wf_countries WHERE country_id = 1246;
myvar2 :=
'1234';
MYVAR2 := myvar2 * 2;
DBMS_OUTPUT.PUT_LINE(myvar1);
End;

A. Modificai blocul folosind regulile de bune practici i re-executai blocul.

B. Codul modificat ar trebui s conin urmtoarele reguli: conversii explicite, identificatori


sugestivi pentru variabile, folosirea atributului %TYPE, regulile de scriere cu litere mici i litere
mari, comentarea codului i identarea codului.

Exerciii suplimentare
1. Scriei un bloc anonim n care v calculai i afiai vrsta i numrul de zile pn la data
de natere (aniversarea voastr);
2. Modificai exerciiul S2L1 E5 astfel nct s afiai i diferena de nivel pentru fiecare
dintre cele 3 ri.
3. Modificai codul de la exerciiul 2 astfel nct s calculai i s afiai diferena de nivel
ntr-un bloc interior.
4. Modificai codul de la exerciiul 3 astfel nct s afiai diferena de nivel, dup afiarea
nlimii minime i maxime. n cte moduri putei face acest lucru?