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

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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1685785789953/aaa4a035-2405-4fc9-bfc6-39289405c0ae.png align="center")

**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:

```xml
<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.

```javascript
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:

```sql
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](https://apex.oracle.com/pls/apex/r/test_sqelme/enrolblog/home)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1685970788621/3cdf2674-e5e2-4ef9-990e-46374cccbaff.png align="center")
