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:

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 :

WILDCARD-URI IN TRIGGERE 'PRE-QUERY' - FOLOSIREA TOKENULUI #


Pentru a face triggerul de interogare mai flexibil permitand folosirea wildcard-urilor puteti face urmatoarele:

  1. Setati atributul `Query Allowed' pentru `EMP.SCR_DNAME'
  2. Schimbati 'Querry Length' pentru EMP.DEPTNO la 255
  3. 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.