FOLOSIREA TOKENULUI `#'
Tabele secundare de interogare
Exemplu.
Trigger PRE-QUERRY
on block EMP
IF :EMP.SCR_DNAME IS NOT NULL THEN
SELECT DEPTNO
INTO :EMP.DEPTNO
FROM DEPT
WHERE DNAME = :EMP.SCR_DNAME;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
MESSAGE ('Department name is invalid;
check spelling');
RAISE FROM_TRIGGER_FAILURE;
Triggerul va lucra atata timp cat:
- Exista o corespondenta unu la unu intre ceea ce introduce utilizatorul si
obiectul corespondent din baza de date;
- Utilizatorul nu introduce wildcard-uri.
In versiunile SQL*Forms anterioare era necesar sa se execute in mod frecvent
interogari pe campurile tabelei secundare. Intrucat optiunea `List of Values'
este acum disponibila in modul `Enter Querry' nu mai este necesara
interogarea bazei de date.
Propunem mai jos o metoda de interogare a bazei de date.
Exemplu.
In blocul EMP, SCR_DNAME este un camp care afiseaza numele unui departament.
Dorim sa executam o interogare bazata pe numele departamentului mai degraba
dacat pe numar. Pentru a face aceasta trebuie sa activam atributul `Query
Allowed' pentru EMP.D_DNAME si sa scriem urmatorul trigger :
Trigger PRE_QUERY on block EMP
IF :EMP.SCR_DNAME IS NOT NULL THEN
SELECT DEPTNO
INTO :EMP.DEPTNO
FROM DEPT
WHERE DNAME = :EMP.SCR_DNAME;
ENDIF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
MESSAGE ('Department name is invalid;
check spelling and reenter');
RAISE FORM_TRIGGER_FAILURE;
Acest trigger funcioneaza cat timp :
- exista o corespondenta unu la unu intre ceea ce introduce
utilizatorul si obiectul corespondent din baza de date
- utilizatorul nu introduce wildcard-uri.
WILDCARD-URI IN TRIGGERE 'PRE-QUERY' - FOLOSIREA TOKENULUI #
Pentru a face triggerul de interogare mai flexibil permitand folosirea
wildcard-urilor puteti face urmatoarele:
- Setati atributul `Query Allowed' pentru `EMP.SCR_DNAME'
- Schimbati 'Querry Length' pentru EMP.DEPTNO la 255
- Scrieti urmatorul trigger `PRE-QUERRY' :
Trigger PRE-QUERY on block EMP
IF :EMP.SCR_DNAME IS NOT NULL THEN
COPY ('# IN (SELECT DEPTNO
FROM DEPT
WHERE DNAME LIKE '''||:EMP.SCR_DNAME||'''),
'EMP.DEPTNO');
ENDIF;
Instructiunea COPY este folosita in locul unei instructiuni de atribuire
pentru ca PL/SQL nu permite asignarea unui sir de caractere unui camp
numeric.
Tokenul # permite adaugarea unui sir direct la interogarea generata de
SQL*Forms. Aceasta ne da o flexibilitate sporita si poate fi folosit intr-o
multime de situatii.