Sunteți pe pagina 1din 18

Construirea de aplicaii folosind Oracle Application

Express

Utiliznd APEX putem construi pagini web fr a avea cunotine de HTML, PHP sau
JavaScript, dei astfel de cunotine ne sunt utile pentru unele personalizri. APEX
este puternic integrat cu baza de date Oracle, astfel nct se pot accesa i gestiona
uor datele, precum i codul stocat.
Putem instala APEX local mpreun cu o baz de date Oracle. Varianta mai facil
este s cerem un Workspace gratuit pe apex.oracle.com: Get StartedFree
WorkspaceApplication Development.

Dup ce primim confirmarea i ne autentificm, n meniul SQL Workshop putem


folosi SQL Scripts pentru a rula un script, spre exemplu, pentru a construi tabelele.
Vom selecta Create i vom face Copy-Paste la urmtorul script:
http://bd.ase.ro/uploads/sgbd_seminar_zi/ru_ldd.txt
Denumim scriptul LDD i-l vom rula: RunRun Now:
APEX nu va recunoate anumite rnduri (cele cu Prompt) dar tabelele se vor construi
cu succes.

n Object Browser putem vedea ca s-au creat tabelele dar c nu au nregistrri.


Observm, de asemenea, c exist i alte tabele construite automat de ctre APEX
(fac parte din Sample Application Database).
n SQL Scripts vom construi un nou script (LMD) pentru:
http://bd.ase.ro/uploads/sgbd_seminar_zi/ru_lmd.txt
Ignorm atenionrile i selectm Run Now.

n Object Browser putem verifica dac tabelele construite au rnduri. Dac este
necesar, putem modifica coninutul dar i structura unei tabele din Object
Browser.
Pentru a rula o comand SQL de sine stttoare sau un bloc PL/SQL (anonim sau
care construiete un subprogram), putem folosi opiunea SQL Commands:
Putem observa n blocul prezentat c nu este necesar clauza SET
SERVEROUTPUT ON i nici caracterul / la final, pentru a rula blocul.
Pentru a construi o interfaa vizual vom selecta Application
BuilderCreateDesktop
La primul pas vom denumi aplicaia Dep_Ang iar Theme Style: Vita-Slate.
La paii urmtori nu facem nicio modificare la opiunile implicite. La pasul
Attributes putem modifica formatul datelor:

La ultimul pas selectm Create Application.


Putem rula aplicaia care are n momentul de fa doar un Home Page.
Vom crea o pagin: Create PageFormSingle Page Master Detail. Selectm
ca Master Table Departamente:
Pas 1:
Pas 2:

Pas 3:
Pentru Detail am ales tabela Angajati:

Atenie: Apsai o singur dat butonul Create!


In Page Designer, selectm DepartamenteColumnsID_Departament. In
dreapta, la Default, selectm PL/SQL Function Body:
DECLARE
L_CP NUMBER;
BEGIN
SELECT NVL(MAX(ID_DEPARTAMENT),0) + 10
INTO L_CP
FROM DEPARTAMENTE;
RETURN L_CP;
END;

Aceast funcie va genera ID-uri pentru departamentele nou adugate.


Asemntor, la Angajai, ID_Angajat, vom folosi funcia:
DECLARE
L_CP NUMBER;
BEGIN
SELECT NVL(MAX(ID_ANGAJAT),0) + 1
INTO L_CP
FROM ANGAJATI;
RETURN L_CP;
END;

Pentru a testa, selectm din dreapta sus, Save iar apoi Run Page.
Din pagina care se deschide, putem selecta departamentul dorit, spre exemplu
Shipping. n partea de jos putem vedea datele despre respectivul departament,
precum i despre angajaii care-l alctuiesc. Putem realiza modificri, att pe
departamente, ct i pe angajai, putnd salva folosind Save.

Modificm la DepartmentsSQL Query:


select ID_DEPARTAMENT,
DENUMIRE_DEPARTAMENT,
ID_MANAGER,
(select adresa
from locatii l where
l.id_locatie=d.id_locatie) Adresa
from DEPARTAMENTE d
Astfel, la rulare va aprea adresa locaiei n locul ID-ului acesteia.
Coloana Adres o setm Query OnlyYES.

Pentru a aduga o list de valori, selectm mai nti Shared Components pentru
aplicaia noastr. De la Other Components selectm List of
ValuesCreateCreate From Scratch. Dm denumirea Angajati_Manageri, tip
Dinamic, iar la textul SQL folosim:
select nume||' '||prenume as display_value, id_angajat as return_value
from angajati
order by 2

Pe pagina master detail Departamente_Angajati, din meniul din stnga selectm


DepartamenteColumnsID_MANAGER iar din dreapta, Column TypePopup
LOB. La List of Values selectm Shared ComponentAngajati_Manager.
La rulare, vom avea lista de valori:

Vom aduga o validare pe coloana SALARIUL din videoformatul master-detail


Departamente. Salariul va trebui sa fie n intervalul SALARIU_MIN..SALARIU_MAX
pentru funcia sa. Click dreapta pe SalariulCreate validation, Type PLSQL
Function Body (Returning Boolean) :
declare
n number(1);
begin
select 1 into n from functii
where :salariul between salariu_min and salariu_max and id_functie=:id_functie;
return TRUE;
exception when no_data_found then return FALSE;
end;
Introducem i un mesaj de eroare:
Salariul nu e in interval

Observm c astfel de validri pot fi realizate la nivelul aplicaiei sau la nivelul BD


folosind declanatori.
Rulm i modificm salariul unui angajat. La salvare vom primi mesajul:
Asemntor, vom construi i o pagin tip Forms Report with Form on a Table.

La pasul 1:
La pasul 2:

La pasul 3 selectm tabela Produse.


La pasul 4:
Selectm Create.
Vom construi triggerul pentru generarea ID_PRODUS.
SQL WorkshopSQL Commands:
CREATE OR REPLACE TRIGGER GEN_ID_PRODUS BEFORE INSERT ON PRODUSE FOR
EACH ROW
BEGIN
SELECT NVL(MAX(ID_PRODUS),0) + 1
INTO :new.id_produs
FROM PRODUSE;
END;
Rulm pagina Informaii Produs i adugm un produs nou. Sortm produsele
descresctor dup id-ul de produs.

Exerciii:
1. S construiasc o validare care s nu permit un pre minim mai mare dect
preul de list
2. S se construiasc un videoformat tip master-detail pe tabele comenzi i
rand_comenzi. S se realizeze o validare care s nu permit un pre de
vnzare mai mic dect preul minim pentru respectivul produs.
Chart
S se construiasc un chart care s surpind evoluia vnzrilor pe fiecare produs.
Construim o pagin nou de tip Chart.
Pasul 2:

Pasul 3:
La pasul 4 selectm ca surs interogarea:
select denumire_produs, sum(pret*cantitate) valoare from produse p join
rand_comenzi r
on p.id_produs=r.id_produs group by denumire_produs
Pasul 5:

Selectm Create.
Rulm pagina. Observm c graficul este foarte ncrcat.
Modificm interogarea (Series1SQL Query):

select denumire_produs, sum(pret*cantitate) valoare from produse p join


rand_comenzi r
on p.id_produs=r.id_produs group by denumire_produs having
sum(pret*cantitate)>30000
La Axa Y selectm la ScalingNone. Redenumim Series1 n Valoare Vnzri.
Rulm din nou: