You are on page 1of 7

Pastrarea obiectelor in baza de date. Instructiuni DML asupra obiectelor.

create or replace type tip_adresa as object


(tara varchar2(25),
localitate varchar2(25),
strada varchar2(40),
bloc number,
apartament number);

create or replace type tip_stud as object


(cod number,
Nume varchar2(22),
Prenume varchar2(22));

CREATE OR REPLACE TYPE "TIP_CLADIRE" AS OBJECT


(cod number,
bloc number,
nr_cam number,
nr_loc number,
descrierea varchar2(40))
/
create table cladire of tip_cladire;
insert into cladire values(tip_cladire(1,4,113,22,’informatica’));
create or replace type tip_grupa as object
(specialitatea varchar2(30),
an number(4),
nr number(2),
sala ref tip_cladire);

create table grupa of tip_grupa;


select g.specialitatea,g.an from grupa g

select g.specialitatea,g.an,g.sala.nr_cam from grupa g

Tabela studenti si grupa au legaturi de tip 1 -la-multe

create table studenti


(persoana tip_stud,
adresa tip_adresa,
grupa ref tip_grupa);

insert into studenti


values(tip_stud(1,'Cucu','Ion'),tip_adresa('RM','Bubueci','Puschin',4,12),null);

select s.persoana.nume from studenti s

Studentul se ataseaza la grupa

RETURNING REF(pseudonim) INTO variabila tip referinta


Returneaza referinta la rindul inserat

declare
v_ref ref tip_grupa;
begin
insert into grupa g values('matematica',2,1,null)
returning ref(g) into v_ref;
update studenti s
set grupa=v_ref
where s.persoana.cod_st=1;

1
end;

Atasarea cladirii grupei. Operatia REF

DECLARE
v_cladireRef REF tip_cladire;
v_bloc cladire.bloc%TYPE;
v_nr cladire.nr_cam%TYPE;
BEGIN
-- Select a reference to the room, not the room itself.
SELECT REF(c)
INTO v_cladireRef
FROM cladire c
WHERE cod = 1;

-- Use the reference in the WHERE clause of a query


SELECT bloc, nr_cam
INTO v_bloc, v_nr
FROM cladire c
WHERE REF(c) = v_cladireRef;

DBMS_OUTPUT.PUT_LINE('Queried ' || v_bloc || ', bloc ' ||


v_nr || ' using REF');
update grupa
set sala= v_cladireRef
where specialitate='matematica';
END;
/

select g.specialitatea,g.an,g.sala.bloc,g.sala.nr_cam from grupa g

delete from grupa g


where g.sala.nr_cam<>5

DANGLING referinta, care a pierdut obiectul, atirna. DEREF nu poate fi


aplicata!!!

DECLARE
v_Stud REF tip_student;
BEGIN
UPDATE STUDENT
SET SALA = NULL
WHEN SALA IS DANGLING;
END;
/

2
operatorii VALUE şi DEREF

VALUE(pseudonim | variabila de corelare) returneaza obiectul dar nu lista de


atribute.

REM This script illustrates the VALUE SQL operator.

set serveroutput on

DECLARE
v_Room Room;
CURSOR c_Building7 IS
SELECT VALUE(r)
FROM rooms r
WHERE building = 'Building 7'
FOR UPDATE;
BEGIN
-- Loop through all of the rooms in Building 7, and add
-- 100 to the number of seats in each.
OPEN c_Building7;
LOOP
FETCH c_Building7 INTO v_Room;
EXIT WHEN c_Building7%NOTFOUND;

v_Room.number_seats := v_Room.number_seats + 100;


UPDATE rooms r
SET r = v_Room
WHERE CURRENT OF c_Building7;
END LOOP;
CLOSE c_Building7;
END;
/
Problema. Aplicarea cunostintelor. Operatorul VALUE.
De marit numarul de locuri in auditoriile cu numerele pare.
Folositi tabela CLADIRI.
ROLLBACK;

-- VALUE can be used in WHERE clauses when compared to the result


-- of a subquery, or to a PL/SQL variable.
SELECT * FROM rooms r1
WHERE VALUE(r1) = (SELECT VALUE(r2)
FROM rooms r2
WHERE ID = 20007);
Problema. De afisat informatiile despre auditoriile din blocul central.

DECLARE
v_Room1 Room;
v_Room2 Room;
BEGIN
-- Select into v_Room1
SELECT VALUE(r)
INTO v_Room1
FROM rooms r
WHERE ID = 20007;

-- And use VALUE in the where clause, compared to v_Room1.


SELECT VALUE(r)
INTO v_Room2

3
FROM rooms r
WHERE VALUE(r) = v_Room1;

v_Room2.Print;
END;
/

Problema. De adaugat metoda print in tipul tip_cladire. Folositi acesta metoda


pentru afisarea rezultatului compararii a doua cladiri. Vezi exemplu de mai sus.

4
Sortare
REM This scripts illustrates the use of ORDER BY on object tables.

-- This is possible because Room has a MAP method.


SELECT VALUE(r)
FROM rooms r
ORDER BY 1;

-- And this succeeds because Student has an ORDER method.


SELECT s.FormattedName()
FROM students s
ORDER BY VALUE(s);

-- However, Class does not have either a MAP nor an ORDER method,
-- so we can't sort by a Class.
SELECT VALUE(c)
FROM classes c
ORDER BY 1;
Problema. De adaugat metoda de sortare la tip_cladire de tip MAP. In ordinea
crescatoare a numarului de locuri.
1. De sters toate obiecte (tabela CLADIRI), care au referinta la tip_cladire
2. De adaugat metoda
3. De recreat tabela CLADIRI.
4. De testat metoda sortarii.
1
drop table cladire;

drop table grupa;


drop table studenti
drop type tip_grupa
DROP TABLE CLADIRE

DROP TYPE TIP_CLADIRE


2
create or replace type tip_cladire as object
(cod number,
bloc number,
nr_cam number,
nr_loc number,
descriere varchar2(40),
map member function sort_cladir return number);

create or replace type body tip_cladire AS


map member function sort_cladir return number is
begin
return nr_loc;
end sort_cladir;
end;
CREATE TABLE CLADIRE OF TIP_CLADIRE;

3
create or replace type tip_grupa as object
(specialitatea varchar2(30),
an number(4),
nr number(2),
sala ref tip_cladire);

create table grupa of tip_grupa;

5
create or replace type tip_stud as object
(cod number,
Nume varchar2(22),
Prenume varchar2(22));

create table studenti


(persoana tip_stud,
adresa tip_adresa,
grupa ref tip_grupa);

insert into studenti


values(tip_stud(1,'Cucu','Ion'),tip_adresa('RM','Bubueci','Puschin',4,12),null);
insert into studenti
values(tip_stud(3,'Popa','Pavel'),tip_adresa('RM','Bubueci','Puschin',4,15),null
);
declare
v_ref ref tip_grupa;
begin
insert into grupa g values('matematica',2,1,null)
returning ref(g) into v_ref;
update studenti s
set grupa=v_ref;
--where s.persoana.cod_st=1;
end;
insert into cladire values(tip_cladire(1,4,113,20,'informatica'));
insert into cladire values(tip_cladire(2,4,114,20,'informatica'));

select * from cladire


CODBLOCNR_CAMNR_LOCDESCRIEREA
1 4 113 20 informatica
2 4 114 20 informatica
DECLARE
v_cladireRef REF tip_cladire;
v_bloc cladire.bloc%TYPE;
v_nr cladire.nr_loc%TYPE;
BEGIN
-- Select a reference to the room, not the room itself.
SELECT REF(c)
INTO v_cladireRef
FROM cladire c
WHERE cod = 1;

-- Use the reference in the WHERE clause of a query


SELECT bloc, nr_loc
INTO v_bloc, v_nr
FROM cladire c
WHERE REF(c) = v_cladireRef;

DBMS_OUTPUT.PUT_LINE('Queried ' || v_bloc || ', bloc ' ||


v_nr || ' using REF');
update grupa
set sala= v_cladireRef
where specialitatea='informatica';
END;
Queried 4, bloc 20 using REF

6
Statement processed.

0.04 seconds
4

Aranjeaza crescator metodei MAP


Pe APEX nu are valoare
SELECT VALUE(c)
FROM cladire c
ORDER BY 1;

SELECT C.BLOC,C.NR_LOC
FROM cladire c
ORDER BY 1 DESC;

SELECT C.BLOC,C.NR_LOC
FROM cladire c
ORDER BY 2;

Analizati rezultatele. Comparati cu lucrul pe serverul local (nu pe APEX)


Declare
V_clad1 TIP_CLADIRE:=TIP_CLADIRE(1,4,111,15,'informatica');
V_clad2 TIP_CLADIRE;
Begin
V_clad2:=TIP_CLADIRE(:c,:b,:a,:n,null); -- : echivalent pe APEX cu & pe
----server
If v_clad1 >v_clad2 then
Dbms_output.put_line('1>2');
End if;
End;

You might also like