:block.field :=PL/SQL_expresie; Exemple : :EMP.SCR_REMUN := :EMP.SAL * 12 + NVL (:EMP.COMM,0); :CTL.TODAY := TO_CHAR (SYSDATE, 'DD/MM'YY'); :MENU.CHOICE := NULL; :GLOBAL.STDPRICE := 20;
Exemple : IF :MENU.CHOICE = '1' THEN GO_BLOCK ('ORD'); ELSEIF :MENU.CHOICE = '2' THEN GO_BLOCK ('ITEM'); ELSE MESSAGE ('INVALID CHOICE'); RAISE FORM_TRIGGER_FAILURE; END IF;
Exemplu : IF :item.qty > 100 THEN MESSAGE ( 'Large order - check stock on hand'); END IF;
In exemplul de mai sus,utilizatorul primeste un mesaj numai daca cantitatea este mai mare de 100.
Sintaxa completa a instructiunii IF este prezentata in ORACLE:SQL,SQL*Plus si PL/SQL,si este prezent in Anexa E.
TRIGGER-ELE QUERY
Exista doua tipuri de trigger-e asociate query-urilor:PRE-QUERY si
POST-QUERY.Ele sunt in mod normal definite la nivel de bloc;asadar,ele
apartin doar blocului particular al formului si sunt executate oricand
utilizatorul executa o interogare (un query) asupra blocului.
Exemplul 1 : Pentru a stabili o interogare in blocul EMP daca nici un departament nu este afisat,se poate folosi urmatorul trigger : PRE-QUERY on EMP Block --------------------------------------------------------------- IF :dept.deptno IS NULL THEN MESSAGE ('Interogati blocul de departament mai intai'); RAISE FORM_TRIGGER_FAILURE; END IF; --------------------------------------------------------------- Exemplul 2 : Acest al doilea exemplu previne orice interogare asupra blocului Dept. PRE-QUERY on DEPT Block --------------------------------------------------------------- IF TO_CHAR (:dept.deptno) || :dept.dname || :dept.loc IS NULL THEN MESSAGE ('Trebuie sa interogati un departament anume'); RAISE_TRIGGER_FAILURE; END IF; --------------------------------------------------------------- Daca utilizatorul da un query global asupra blocului Dept,mesajul este afisat si trigger-ul esueaza.Acest lucru inseamna ca formul va ramane in modl query asteptand pentru actiuni urmatoare ale utilizatorului.
Exemplu : POST-QUERY on EMP Block ----------------------------- :emp.annsal := :emp.sal * 12; -----------------------------
Trigger-ul Post-Query este executat DUPA ce inregistrarile sunt extrase
din baza de date in query.Se activeaza de fiecare data cand SQL*Forms
afiseaza o nireegistrare in bloc.Daca trigger-ul esueaza,inregistrarea
curenta ce este procesata nu este afisata.
El este de obicei folosit pentru :
Exemplu : Trigger-ul de mai jos va calcula o informatie statistica despre angajati corespunzator departamentului curent : POST-QUERY on DEPT Block ----------------------------------------------- SELECT COUNT(empno),SUM(sal * 12 + NVL(comm,0)) INTO :dept.scr_headcount,:dept.scr_deptcost FROM emp WHERE deptno = :DEPR.DEPTNO; -----------------------------------------------
Exemplul 1: Acest trigger previne un query asupra blocului EMP daca nici un departament nu este afisat in blocul DEPT : PRE-QUERY on EMP Block ------------------------------------------------------------ IF :dept.deptno IS NULL THEN MESSAGE ('Interogati blocul referitor la departament mai intai'); RAISE FORM_TRIGGER_FAILURE; END IF; ------------------------------------------------------------ Exemplul 2: Acest trigger calculeaza intervalul de timp in care un angajat a lucrat la firma si scrie valoarea intr-un camp al unei tabele non-base : POST-QUERY on EMP Block ---------------------------------------------------------- :emp.scr_month := months_between (sysdate, ;emp.hiredate); ----------------------------------------------------------
Acest trigger se activeaza doar la interogare.Pentru a calcula acelasi
lucru cu ajutorul operatiilor insert/update,scrieti un trigger
On-Validate-Field (continand un cod similar) in EMP.HIREDATE.
Nota : daca un trigger Post-query esyeaza inregistrarea NU VA FI afisata.
O-V-F on EMP.EMPNO | | O-V-F on EMP | | | | O-V-F on form | | | | | | | | | | | | | | ___________________________ | | | DEPT | | | | | | | | ###### ###### ###### | | | |---------------------------- | | | | | |-->| EMP | | | | | | | | | | |---------->| EMPNO ENAME SAL | | ###### ###### ###### | | | |___________________________|
In exercitiile de pana acum,v-a fost indicat sa definiti trigger-ul
la un camp sau bloc particular.Anumite trigger-e,ca P-C + o-V-F sunt
de obicei folosite la nivel de camp;altele,ca Pre-Q sau Post-Q nu
pot apartine unui camp si sunt de obicei definite la nivel de bloc .
Un trigger are definitie la nivel de form,bloc sau camp.Acest nivel este determinat de intarea in caracteristicile trigger-ului de tip Block sau Field (camp) cand este definit. amandoua aceste campuri vor fi vide pentru un trigger la nivel de form. --------------------------------------------------------------- | ------------------Trigger Definitions---------------- | | ____________________________________________________ | | | | | | | Trigger: KEY-CLRBLK | -For key Triggers only- | | | | Block: ORD | [X] Show Keys | | | | Field: | Descrip: | | | | Trigger Style: V3 | | | | |__________________________|_________________________| | |_______________________________________________________________|
In SQL*Forms(Design),mesajele sunt afisate pe ecran si de asemenea
sunt scrise in fisierul Formname.Err.
Cand se genereaza un form din linia de comanda,se pot vedea mesajele
de eroare afisate,in acelasi timp,pe ecran;erorile sunt de asemenea
scrise si in fisierul Formnam.Err.optiunea -b suprima afisarea
mesajelor.
Daca nici o eroare nu apare pe timpul compilarii,fisierul Formname.Err
este sters automat.
Mesajul de eroare include un numar de eroare,numarul linei si numarul
coloanei,urmate de descrierea erorii :
Error 49 at line 4,column 20: Bad bind variable 'ORD.ORDID' Codurile de erori ale lui PL/SQL sunt documentate in "Oracle Error Messages and Code Manual Version 6".
* -- indica o linie (sau partial o linie) de comentariu. :total := NVL (:total,0) + 1 --increment counter * /* */ incadreaza textul unui comentariu. /****** * Acesta este un mod de a scrie * un comentariu! ******/
:a := 2; --A va fi folosit ca increment.
/* si */: /* Acesta este un comentariu care cuprinde mai multe linii*/
WARNING: COMMPLAN is null; please update with A,B or C.
Idee : Deoarece campul ORD.ORDID este automat generat,el nu va fi niciodata null.Trebuie sa testati ALT camp decat ORDID in acest trigger. Pentru a testa trigger-ul : -> executati formul Orders. -> apasati [Next Block]. -> Apasati [Execute Query].
1. ____________________________________________________________________ | Trigger: POST-QUERY | -------For Key Triggers Only------ | | Block: ORD | [ ] Show Keys | | Field: | Describ : | | Trigger Style: V3 | | |-------------------------------|------------------------------------| | -----------------------Trigger text----------------------- | | IF :ORD.COMMPLAN IS NULL THEN | | MESSAGE ('WARNING:Commplan is null - please update with A, | | B or C'); | | END IF; | | | | | |____________________________________________________________________| 2. Nici o solutie formala. 3. ____________________________________________________________________ | Trigger: PRE-QUERY | -------For Key Triggers Only------ | | Block: ITEM | [ ] Show Keys | | Field: | Describ : | | Trigger Style: V3 | | |-------------------------------|------------------------------------| | -----------------------Trigger text----------------------- | | IF :ORD.CUSTID IS NULL THEN | | MESSAGE ('ERROR: Please display an order first'); | | RAISE FORM_TRIGGER_FAILURE; | | END IF; | | | | | |____________________________________________________________________| Nota : CUSTID nu este un camp null;oricand este afisat,CUSTID nu va fi null. 4. ____________________________________________________________________ | Trigger: ON-VALIDATE-FIELD | -------For Key Triggers Only------ | | Block: ITEM | [ ] Show Keys | | Field: | Describ : | | Trigger Style: V3 | | |-------------------------------|------------------------------------| | -----------------------Trigger text----------------------- | | :ITEM.ITEMTOT := :ITEM.QTY * :ITEM.ACTALPRICE; | | | | | | | | | | | |____________________________________________________________________|