Sunteți pe pagina 1din 9

DATA PROFILING

INTRODUCERE
Lucrarea are ca scop construirea unei baze de date sursă de la care să se poată construi un
depozit de date pentru activitatea unei clinici de medicină de familie. Datele sunt stocate în tabele
relaționale, iar pentru construirea depozitului se creează tabele care vor reprezenta surse de date
pentru obiectele depozitului. În urma unor prelucrări preliminare, au fost obținute tabelele sursă
din schema următoare:

Tabelele prezentate în schemă sunt:


1. Pacienți
2. Rețete
3. Rand rețetă
4. Medicamente

Pentru generarea tabelelor prezentate anterior a fost utilizat scriptul ce se regăsește în


Anexa 1.
Datele introduse în tabelele de mai sus prezintă inconsecvențe. Dorim corectarea acestor
neconcordanțe. Metodele de corecție vizează fixarea înregistrărilor inconsecvente prin modificarea
valorilor invalide.
De exemplu, pentru tabela PACIENTI se pot observa următoarele probleme la nivelul
datelor stocate:

1. Pentru coloana GEN nu există o variantă unică de stocare a datelor


 înlocuirea valorilor eronate cu o valoare din mulțimea {‘F’,’M’}
2. Pentru coloana INALTIME există valori eronate
 înlocuire automată a valorilor eronate cu valoarea minimă
3. Pentru coloana DATANASTERII există valori eronate
 Testăm dacă data nașterii are anul mai mic decât 1900 și este mai mică decât data curentă
(SYSDATE)
4. Pentru coloana STARECIVILA există valori eronate
 înlocuire automată a valorilor eronate cu o valoare similară
5. Pentru coloana GRUPVARSTA există valori eronate
 înlocuire automată a valorilor eronate cu o valoare similară

Pentru o concordanță sporită a datelor au fost implementate și două proceduri care verifică
următoarele:
1. Pentru coloana STARECIVILA există valori eronate în raport cu GRUPVARSTA
 Testăm dacă grupa de vârstă este „copil” și setăm pentru acest caz starea civilă
„necăsătorit” și data căsătoriei NULL
 Testăm dacă vârsta este mai mică decât 18 ani și setăm pentru acest caz grupa de vârstă
„copil”, altfel dacă vârsta este între 18 ani și 65 de ani, inclusiv, setăm grupa de vârstă
„adult”, altfel grupa de vârstă este „vârstnic”


ANEXE
ANEXA 1 – Creare tabele

CREATE TABLE PACIENTI


( IDPACIENT NUMBER(4, 0) NOT NULL
, NUME VARCHAR2(50 BYTE) NOT NULL
, DATANASTERII DATE NOT NULL
, GRUPVARSTA VARCHAR2(20 BYTE)
, GEN VARCHAR2(20 BYTE)
, INALTIME NUMBER(5, 2)
, STARECIVILA VARCHAR2(30 BYTE)
, DATACASATORIEI DATE
, CONSTRAINT PACIENTI_PK PRIMARY KEY ( IDPACIENT )
);
CREATE TABLE Retete(
IdReteta NUMBER(4,0) NOT NULL,
Diagnostic VARCHAR2(50),
DataEliberare DATE,
IdPacient NUMBER(4,0) NOT NULL,
CONSTRAINT RETETE_PK PRIMARY KEY ( IDRETETA )
);
ALTER TABLE Retete
ADD CONSTRAINT PACIENTI_FK
FOREIGN KEY (IdPacient) REFERENCES PACIENTI(IdPacient);
CREATE TABLE Medicamente(
IdMedicament NUMBER(4,0) NOT NULL,
Denumire VARCHAR2(50),
Descriere VARCHAR2(50),
CONSTRAINT MEDICAMENTE_PK PRIMARY KEY ( IDMEDICAMENT )
);
CREATE TABLE RandReteta(
IdReteta NUMBER(4,0) NOT NULL,
IdMedicament NUMBER(4,0) NOT NULL,
CONSTRAINT RANDRETETA_PK PRIMARY KEY ( IDRETETA, IDMEDICAMENT),
CONSTRAINT RETETE_FK FOREIGN KEY(IDRETETA) REFERENCES
RETETE(IDRETETA),
CONSTRAINT MEDICAMENTE_FK FOREIGN KEY(IDMEDICAMENT) REFERENCES
MEDICAMENTE(IDMEDICAMENT)
);
ANEXA 2 – Inserare date

INSERT INTO PACIENTI VALUES(1, 'Popescu Andrei', TO_DATE('21-10-1996','DD-MM-


YYYY'), 'Adult', 'M', 1.77, 'Necasatorit', To_Date('02-12-2016','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 2,'Ionescu Teodor', TO_DATE('27-04-2004','DD-MM-
YYYY'), 'copil', 'masculin', 1.82, 'casatorit',NULL);
INSERT INTO PACIENTI VALUES( 3,'Devescu Ionela', TO_DATE('27-07-2005','DD-MM-
YYYY'), 'Adult', 'feminin', 1.7, 'Casatorit',NULL);
INSERT INTO PACIENTI VALUES( 4,'Camui Iuliana', TO_DATE('27-03-1956','DD-MM-
YYYY'), 'varstnic', 'fem.', 1.65, 'vaduv', TO_DATE('23-07-1977','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 5,'Vasilescu Vasile', TO_DATE('13-12-1957','DD-MM-
YYYY'), 'copil', 'M', -7, 'casatorit', TO_DATE('24-07-1975','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 6,'Vasilescu Ana', To_Date('13-12-1959','DD-MM-
YYYY'), 'varstnic', 'F', 1.70, 'casatorit', To_Date('24-07-1975','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 7,'Vasile Ion', TO_DATE('13-02-1944','DD-MM-
YYYY'), 'varstnic', 'M', 1.78, 'vaduv', TO_DATE('04-06-1966','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 8,'Vasile Ana', TO_DATE('19-03-1975','DD-MM-
YYYY'), 'adult', 'F', 1.62, 'casatorit', TO_DATE('24-08-2006','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 9,'Vasile Mihai', TO_DATE('13-03-1973','DD-MM-
YYYY'), 'adult', 'M', 1.82, 'casatorit', TO_DATE('24-08-2006','DD-MM-YYYY'));
INSERT INTO PACIENTI VALUES( 10,'Vasile David', to_date('10-09-2007','DD-MM-
YYYY'), 'copil', 'M', 1.54, 'necasatorit', NULL);

INSERT INTO "VOCHESCU_ANCUTA"."RETETE" (IDRETETA, DIAGNOSTIC,


DATAELIBERARE, IDPACIENT) VALUES ('1', 'otita', TO_DATE('21-MAR-2018', 'DD-
MON-RR'), '1');
INSERT INTO "VOCHESCU_ANCUTA"."RETETE" (IDRETETA, DIAGNOSTIC,
DATAELIBERARE, IDPACIENT) VALUES ('2', 'sinuzita', TO_DATE('04-APR-2018', 'DD-
MON-RR'), '6');

INSERT INTO "VOCHESCU_ANCUTA"."MEDICAMENTE" (IDMEDICAMENT,


DENUMIRE) VALUES ('1', 'paracetamol');
INSERT INTO "VOCHESCU_ANCUTA"."MEDICAMENTE" (IDMEDICAMENT,
DENUMIRE, DESCRIERE) VALUES ('2', 'olynth', 'ajuta la reducerea congestiei mucoasei
nazale');

INSERT INTO "VOCHESCU_ANCUTA"."RANDRETETA" (IDRETETA,


IDMEDICAMENT) VALUES ('1', '1');
INSERT INTO "VOCHESCU_ANCUTA"."RANDRETETA" (IDRETETA,
IDMEDICAMENT) VALUES ('2', '2');
ANEXA 3 – Funcții custom

BEGIN
If extract(year from datanasterii) > 1900 and datanasterii < sysdate then
return datanasterii;
Else
return TO_DATE('01-01-1901','DD-MM-YYYY');
End If ;
END;

BEGIN
If lower(GEN) in ('feminin','fem.','fem') then
return 'F';
Else
return 'M';
End If ;
END;
ANEXA 4 – Proceduri

DECLARE
v_age NUMBER:=0;
CURSOR c_pacienti is
SELECT DataNasterii FROM pacienti for update of GrupVarsta;
BEGIN
for v_row in c_pacienti
LOOP
v_age := trunc(months_between(sysdate,v_row.DataNasterii)/12);
if v_age<18 then
UPDATE pacienti
SET GrupVarsta = 'copil'
WHERE CURRENT OF c_pacienti;
elsif v_age>=18 and v_age<=65 then
UPDATE pacienti
SET GrupVarsta = 'adult'
WHERE CURRENT OF c_pacienti;
else
UPDATE pacienti
SET GrupVarsta = 'varstnic'
WHERE CURRENT OF c_pacienti;
end if;
END LOOP;
commit;
END;
DECLARE
CURSOR c_pacienti is
SELECT GrupVarsta FROM pacienti for update of StareCivila, DataCasatoriei;
BEGIN
for v_row in c_pacienti
LOOP
if v_row.GrupVarsta='copil' then
UPDATE pacienti
SET StareCivila = 'necasatorit'
WHERE CURRENT OF c_pacienti;
UPDATE pacienti
SET DataCasatoriei = NULL
WHERE CURRENT OF c_pacienti;
end if;
END LOOP;
commit;
END;