Skip to main content

Command Palette

Search for a command to run...

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

Updated
•View as Markdown
PL/SQL futtatása a háttérben
D
Oracle ACE Pro, founder of Enrol Consulting, and Oracle Database and APEX developer with more than two decades of experience building data-driven business applications. I write about Oracle Database, APEX, cloud and AI-assisted development.

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

More from this blog

David Pataki

15 posts

Oracle ACE Pro, founder of Enrol Consulting, and Oracle Database and APEX developer with more than two decades of experience building data-driven business applications. I write about Oracle Database, APEX, cloud and AI-assisted development.