PL/SQL futtatása a háttérben

Table of contents

No heading

No headings in the article.

Az APEX framework elég jól kiszolgál bennünket a deklaratív alkalmazásfejlesztés során. A page szerkesztőben "drag and drop" módszerrel felépítjük az oldalunkat, módosítjuk néhány tulajdonságát az elemeknek, esetleg írunk néhány processt vagy validációt és kész is a működő oldalunk.

Az alap működés során azonban az oldalunkat minden Submit vagy Redirect után újra elkérjük a szervertől, tehát az egész oldalunk újraépül. Ilyenkor a kurzor pozíciók elveszhetnek és a felhasználói élmény is romlik.

Ebben a postban bemutatom a háttérben történő eljáráshívást (AJAX) az APEX környezetben.

A példánkban egy egyszerű Classic Report cellájának értékére kattintva szeretném a megjelenített értéket megduplázni.

A megoldás menete a következő lesz:

  1. Kattinthatóvá tesszük az értékeket

  2. Kattintás esetén meghívásra kerül egy Javascript függvény

  3. A függvény meghív egy PL/SQL Page process-t

  4. Végrehajtjuk az érték duplázását egy SQL utasítással

  5. Frissítjük a riportot az új eredménnyel

A Classic Report most az SQL utasításunk eredményeképpen kapott Salary oszlopot jeleníti meg. Írjuk be az oszlop HTML Expression tulajdonságába a következőt:

<a href="javascript:onlcick=f_salary(#EMPLOYEE_ID#);">#SALARY#</a>

Figyeljük meg, hogy a riportunkban a Salary oszlop kattinthatóvá válik. Kattintás esetén meghívja az f_salary() javascript függvényt, ami még nem létezik, ezért hozzuk létre az oldal tulajdonságai között a Function and Global Variable Declaration részben.

function f_salary(id) {
   console.log("id: " +id);
   apex.server.process('PROC_SALARY',
            {x01:id},
            {dataType: 'text',
                success: function(pData)
                            {
                                console.log("Eredmény: "+ pData );
                                apex.region("myREPORT").refresh();             
                            }
            }                
                        );
    };

A függvény bemenő paramétere az Employee_id oszlop értéke, erre majd az adat frissítésénel lesz szükségünk, hiszen innen tudjuk majd, hogy melyik dolgozó fizetésére történt a kattintás.

A console.log utasítással szövegeket tudunk a böngésző konzol ablakába kiíratni, aminek a megoldás szempontjából nincs jelentőssége, a hibakeresésnél azonban hasznos lehet tudni, hogy hol is járunk a futásban.

Az apex.server.process beépített javascript utasítás első paramétere az az oldal vagy applikáció szintű PL/SQL process, amit a javascript függvényünk meghív. Most csak egy paramétert adunk át, az X01 pozícióban. A dataType a visszatérési érték típusát adja meg, amely alapesetben Json, de mi most csak egy karaktersorozatot várunk, ezért text. (A visszatérési értéknek a példánkban nincs jelentősége, csupán ez is kiíratásra kerül a konzolra.)

Ha sikeresen lefutott a háttérben a PROC_SALARY process, akkor az apex.region("myREPORT").refresh(); javascript utasítással frissítjük a riportunkat. A riportra egy azonosítóval hivatkozunk - esetünkben myREPORT - amit a Classic Report régió Static ID tulajdonságánál állítottunk be.

A PROC_SALARY eljárás kódja a következőképpen néz ki:

begin
update oehr_employees set salary=salary*2 
where employee_id=apex_application.g_x01;
commit;
    htp.p('ok');
end;

Maga az eljárás az oldal AJAX Callback részénél került létrehozásra, mivel az nem kötődik az oldal valamely eseményéhez.

A Javascript, kliens oldali hívás paraméterét az apex_application.g_x01 függvény adja vissza, így ezt fel tudjuk használni az SQL utasítás szűrési paramétereként.

A htp.p utasítással pedig visszatérési értéket adhatunk az AJAX call-nak.

A kliens oldali kódok kis- és nagybetű érzékenyek, ha ebben hiba van, nem fog futni a kódunk!

A megoldás kipróbálható az alábbi linken:

https://apex.oracle.com/pls/apex/r/test_sqelme/enrolblog/home