Ugrás a fő tartalomra

APEX kezdő alkalmazás készítése 1.

APEX alkalmazás komponensek és használatuk

Az SQL műhely egy olyan komponens, amely egy webböngészőn keresztül
interaktív kapcsolatot enged meg az adatbázissal.


- Az SQL műhely tevékenységei


Az itt elvégezhető főbb feladatok:
- adatbázis objektumok megtekintése, kezelése (Object Browser),
- SQL utasítások és PL/SQL programok futtatása (SQL Commands),
- SQL szkriptek szerkesztése, betöltése, mentése és futtatása (SQL Scripts),
- adatbázis objektumokból (tábla, nézet, stb.) szemléletes lekérdezések előállítása (Query Builder a Utilities-ben),
- adatok betöltése és kimentése (Data Workshop a Utilities-ben).


- Az SQL Commands komponens

Ezt használjuk az SQL utasítások és a PL/SQL blokkok meg-írására, szerkesztésére, futtatására
és törlésére. E komponens ablaka két részből áll, a felső részen található
a szerkeszthető utasításablak, az alsón pedig az eredményablak egy hozzátartozó menüsorral.
A utasításablak felső részén bejelölhető az Autocommit jelölőnégyzet
(mellyel a DML-utasítások automatikusan véglegesíthetőek),
beállítható az eredményablakban megjelenő sorok száma (Rows),
a parancsok törlése (CommandClear), a táblák keresése (Find Tables)
, és itt található a mentés (Save), és a futtatás (Run) ikonja.

- TÁBLA LISTÁZÁSA

Rákattintással válasszuk ki az SQL Commands komponenst.
Írjunk be az utasításablakba egy SELECT utasítást, majd a Run gombra való kattintással,
vagy a CTRL+Enter billen-tyű-kombináció lenyomásával futtassuk le.
Az eredményablak jeleníti meg lekérdezés listájából annyi sort, amennyit beállítottunk,
vagy a hibaüzenetet (ha a beírt utasítás nem hajtható végre, mert hibás).
Egyszerre csak egy utasítás hajtható normál módban végre, ebben az esetben
az utasítás végére nem kell pontosvessző.

Amennyiben egyszerre több utasítás található az utasítás ablakban,
akkor egy utasítást jelöljünk ki, és a Run gombra való kattintással ez lesz végrehajtva.

- EXPLAIN MENÜPONT

Itt megtekintjük az SQL utasítások végrehajtási tervét. A végrehajtási tervből egyebek mellett
látszik, hogy az adatbázis motor milyen lépések segítségével, milyen objektumokon keresztül
(táblák, indexeket, stb.) hajtja végre az SQL utasítást.
Ilymódon a teljesítmény problémák mellett, akár a hibás tábla-összekapcsolás (join)
is tettenérhető.

Nézzük meg például az SQL Commands komponens utasításablakába írt, dolgozók
és telephelyük listáját megjelenítő SQL utasítás végrehajtásának értelmezését.
A Query Plan táblázatból például kiolvasható, hogy az eredménylista
hány sorból áll, amely a más táblával van összekapcsolva.
Láthatók az oszlopok indexei, a séma és a táblák oszlopai.
Mindezekből az utasítás hibáit könnyebben kideríthetjük.

- SAVED SQL MENÜPONT

Az utasításablakban az SQL utasítások felhasználó által megadott néven elmenthetők
(a SAVE gomb segítségével), majd a Saved SQL menüpont, a Find kereső-mező
és a Go gomb segítségével előhívhatók. A megfelelő utasítás hiperlinkjére kattintva,
az futtatható, megváltoztatható, és újra elmenthető, illetve akár törölhető is.


- HISTORY MENÜPONT

E menüpont kiválasztása esetén az eredményablakban az aktuális felhasználó (séma) összes,
az SQL Commands ablakban végrehajtott utasítása látható. Ezeken a Find mezőben a korábbi
utasítások tetszőleges alsztringje szerint szűrés is végezhető.
E listából esetenként egyszerűbb egy már megírt SQL utasítást megjeleníteni,
mint azt ismételten beírni (1.31. ábra). Amelyik utasítást kijelöljük (kattintással),
azt betölti az utasításablak-ba, ahol azt módosítani, futtatni, illetve elmenteni egyaránt lehet.

- Az SQL Scripts komponens

Az SQL műhely harmadik eleme az SQL Scripts komponens.
Ennek segítségével lehet egy szkript programot betöltetni, szerkeszteni, majd futtatni,
vagy az APEX-ben elkészített szkripteket elmenteni a háttértáron.
Készítsünk egy szkript ehhez kattintsunk a jobb oldali Task ablakban a Create gombra.
Írjuk meg a programot majd futtassuk le (Run).
Ha mindent rendben találunk, akkor kattintsunk a Run Now gombra.

Nézzük meg az eredményt, kattintsunk a View Result ikonra,
majd a Details rá-diógombot jelöljük ki (Ez utóbbi segítségével nem csupán az egyes utasítások
eredménye, de még a futásukhoz szükséges idő is megjelenik.).
Az eredmény láthatóan jó, csak a kerekítés hiányzik, kattintsunk az Edit Script gombra,
és írjuk az átlag elé a Round függ-vényt. vagy menjünk vissza az SQL Script felületre
és az Edit oszlopban kattintsunk a négyzetben levő ceruzára.

Ha a  szkript sikeresen lefutott. A képernyő jobb oldalán van egy Export menüpont,
 mellyel a szkript program text fájlba menthető, az így létrehozott szövegfájl azonban
 az APEX környezetre vonatkozó beállításokat is tartalmazza, ezért ehelyett cél-szerűbb a
hagyományos Windows-os (kijelőlés, Ctrl-C, Ctrl-V) másolással kitenni egy szövegfájlba.

- A Query Builder komponens

Az SQL műhelyben található a Lekérdezés Varázsló (Query Builder) komponens.
Segítségével egyszerűbb lekérdezéseket lehet grafikus módon összeállítani.
E funkció az SQL műhelyen belül bármelyik komponens jobb oldali kis   ikonjával,
vagy pedig a Utilities eszközön belül a   komponens indításával elérhető.


A hozzátartozó ablak négy részből áll:
1. Az Objektum Ablak, melyből az elkészítendő lekérdezés objektumai választhatók ki.
2. A Grafikus Tervező Ablak, melyben a kiválasztott objektumok grafikusan összekap-csolhatók. Két funkcionális Eleme az Objektum Táblázat és az objektumok közötti kapcsolatot jelző Kapcsolati Vonal. A Grafikus Tervező Ablak jobb felső részében az összeállított lekérdezés (SELECT utasítás) elmentésének (Save) és futtatásának (Run) gombjai találhatók.
3. Szerkesztő Ablak, melynek menüsora az alábbiakat tartalmazza:
- Condition: itt szerkeszthető a lekérdezés feltételrésze,
- SQL: megjeleníti az összeállított SELECT utasítást,
- Results: megjeleníti a lefuttatott lekérdezés ereményét,
- Saved SQL: segítségével az elmentett lekérdezés visszatölthető.
4. Felosztó Léc: erre kattintva eltüntethető az Objektum Ablak, és egyúttal megnő a
Grafikus Tervező és a Szerkesztő Ablak. Az erre történő ismételt kattintás hatására
visszaáll az eredeti ablakszerkezet.


- A LEKÉRDEZÉS VARÁZSLÓ (QUERY BUILDER) HASZNÁLATA

Első lépés az objektum kiválasztása. A kiválasztott objektum nevére kattintva,
az átkerül egy úgynevezett Objektum Táblázatként a Grafikus Tervező Ablakba.
Az Objektum Táb-lázatban be lehet jelölni, hogy a tábla mely oszlopai jelenjenek meg a
lekérdezésben, illet-ve, hogy mely oszlopok segítségével valósuljon meg a táblák összekapcsolása.
Ez mutatja a betöltött objektum szerkezetét, vagyis az Objektum Táblázatot grafikus módon.
Ez két részből áll; az Objektum Fejlécből, valamint a tábla egyes oszlopainak neveit
s tulajdonságait tartalmazó Objektum Sorokból:




- A grafikus tervező megjelenő táblázat.


- Az Objektum Fejléc az alábbiakat tartalmazza
-Table Action: Segítségével a tábladefinícióban már szereplő referencia
és idegen kulcs megszorítások alapján táblakapcsolatok hozhatók létre, valamint kijelölhető
az összes oszlop megjelenítésre, illetve ez vissza-vonható (Check all).
Például az emp tábla Objektum Táblázatán a Table Action gombra kattintva a felugró ablak első
Join utasítását kijelölve, megjelenik az emp1 Objektum Táblázat és a két táblázat
(korrelált) összekapcsolása.


- Felugró ablak a Table Action gombra kattintáskor

Táblanév: Az automatikusan generált alias neve, ha még egy emp táblát felte-szünk a grafikus felületre (emp esetén például emp_1).
Show/Hide Columns: Segítségével megjeleníthetőek/elrejthetőek az Objektum Sorok.
Remove: Segítségével törölhető egy tábla a grafikus tervező ablakból.

   Az Objektum Sorok az alábbiakat tartalmazzák

-Jelölő négyzet: Erre való kattintással a hozzátartozó oszlop bekerül a lekérdezés szelekciós listájába.
-Oszlopnév: Eredeti oszlopnév.
-Típus mező: Az oszlop adattipusának grafikus jele.
-Összekapcsoló mező: Erre kattintva kezdeményezhetünk egy összekapcsolást egy másik tábla
valamely oszlopával. Az összekapcsolás akkor jön létre, ha egymás után két tábla valamely
sorainak Összekapcsoló mezőire kattintunk.
E kapcsolat grafikai jeleként rajzolódik ki a kijelölt Objektum Sorok között az úgynevezett
Kapcsolati Vonal, melyre kattintva, választhatunk a különböző tipsú külső összekapcsolások
közül.

- A Feltétel Lap jeleinek és menüpontjainak jelentését az alábbiakban mutatjuk meg:


-Fel-, lemutató nyíl Vezérli az oszlopok egymás utáni helyzetét a szelekciós listában
-Column Az oszlop nevét jeleníti meg
-Alias Másodlagos oszlopnév
-Object Az objektum felhasználói neve
-Condition Oszlopfeltétel megadása (a WHERE feltétel)
Például:
>=120
=’RT’
IN (SELECT deptno FROM dept)
BETWEEN sysdate AND sysdate-20
LIKE ’%KM%’
-Sort Type A rendezés típusa: ASC, DESC
-Sort Order Sorbarendezés a megfelelő oszlopok szerint. Itt számokat kell beírni, tehát 1, 2, 3,
-Show A szelekciós listában való megjelenés előírása/letiltása

-Function
 A NUMBER típusú függvények:
COUNT, COUNT DISTINCT, AVG, MAX, MIN, SUM

 A VARCHAR2 és CHAR típusú függvények:
COUNT, COUNT DISTINCT, INITCAP, LENGTH, LOWER, LTRIM, RTRIM, TRIM, UPPER

 A DATE és TIMESTAMP típusú függvények:
COUNT, COUNT DISTINCT
- Group By A csoportosító oszlopok kijelölése
- Delete A kijelölt oszlop törlése a feltételrészből


- Segédprogramok (Utilities) komponens

A Segédprogramok (Utilities) komponens segítségével egyszerű lekérdezéseket állítha-tunk össze,
adatokat tölthetünk be és vihetünk ki az adatbázisba/ból, készíthetünk könyv-tárat (dll),
láthatjuk az objektumok listáit, helyreállíthatjuk az eldobott objektumokat, stb.



-  Lehetséges segédprogramok

-A Lekérdezés varázsló (Query Builder) használatáról fent volt már szó.
-A második ikon az Adatkezelés (Data Workshop):
Az adatokat ki lehet vinni az adatbázisból, és be lehet tölteni az adatbázisba, azaz:
– adat betöltése (Data Load),
– adat kivitele (Data Unload),
– raktár (Repository).
Az adattáblából lementett (Data Unload) ada-tok lehetnek txt, és xml tipusúak,
míg a betölthetők (Data Load) txt, xml és spred-sheet (csv) típusúak.


-  Adatkezelés

- Táblák csomagjait készíthetjük el a Methods on tables menüpont segítségével.
- User Interface Default: Megváltoztathatjuk az alapértelmezett fel-használói interfész Tartományait (Region) és Elemeit (Item). A varázsló segítségé-vel specifikálhatjuk, hogy melyik létező felhasználói felületet szeretnénk használni. Varázslóval létrehozott Ürlap (Form) vagy Tartomány az alapértelmezett in-formációkat használja tulajdonságaihoz.


Két kategóriája van: 
             Tábla Szótár (Table Dictionary): az adatbázisban definiált táblák és
                  oszlopok alapértelmezését határozhatjuk meg
             Tulajdonság Szótár (Attribute Dictionary): oszlopnevek és tulajdonságai-
                  nak alapértelmezését adhatjuk meg.

- Schema Comparison: Két séma adatbázis objektumait képes összehasonlítani. Mindkettőnek ugyanazon a munkaterületen kell lenni.
- Object Reports:




-   Objektumok listázása 


- Listázza az adatbázis tábláin keresztül ennek részleteit az első ablakban 
- Listázza a titkosság részleteit, objektumok engedélyezését, oszlopokszerpkörök és a
  rend szerjogokat.
- PL/SQL Reports: megjelenítheti a unitokat, a unit sorainak számát, megkeresh-et-
  jük a forráskódokat.
- Exception Reports: Megjeleníti a nem indexelt Idegen kulcsokat, azokat a
táblákat, amelyeknek nincs Elsődleges Kulcsuk, indexük és triggerük.
  - Lomtár (Recycle Bin): megmutatja és visszaállítja az eldobott objektumokat.
Két kategoriája van:
- (Dropped Object) Menedzseli a lomtárban levő objektumokat
- (Purge Recycle Bin) :Kiüríthető megjelenítés nélkül a lomtár
  - RESTful Services:

A REST = Representational State Transfer (REST). A World Web, osztott hipermédia
rendszer szoftver architektura stílusa. A szolgáltatás leírja ezt, mint RESTFul,
ha az alapkészlete megegyezik a REST -el.
A REST a következő karakterisztikát tartalmazza:
- Az adatokat az erőforrás modellizálja. Az erőforrást az URLs határozza meg.
- Egy kis készletet használ a az erőforrás kezeléshez
(például: PUT, POST, GET, DELETE)
Maga a szolgáltatás a publikus Web szolgáltatás alkalmazásait kezeli, azokét,
amelyek elérhetők más alkalmazások összeköthető adataival.
Például beállíthatunk egy RESTful szolgáltatást annak érdekében,
hogy ismételten előállítsuk minden dolgozó nevét egy egyéni részleg számára.


Egy webes adatbázis-alkalmazás fejlesztése három alapvető tevékenységből áll;

- a felhasználói felület (User Interface – UI) létrehozásából,
- valamint az alkalmazási logika
- és az alkalmazás-komponensek megtervezéséből.

Az Alkalmazás Varázsló (Application Builder) mindhárom tevékenységre alkalmas.
Az APEX alkalmazások tulajdonképpen weblapok gyűjteménye. A lapokon különböző navigációs vezérlők találhatók, mint például az ablak-kiválasztó (navigációs) fülek, a gombok és a hiperhivatkozások.

Az alkalmazás alapegysége a lap (page). A lap különböző helyzetű tartományokra (region) osztható fel.

  -  A tartomány a lap egy olyan területe, mely valamilyen összefüggő tartalmat foglal ma-gába. A tartomány tartalmát a forrása határozza meg. Például a tartomány lehet egy SQL lekérdezés eredménye, vagyis egy riport, vagy tartalmazhat statikus html szöveget.


- A tartomány grafikus elemei a következők:

- Elem (Item), például a szöveg mező (text), a (többsoros) szöveg terület (text area), a lenyíló szövegmező (combobox), stb. Ezt később részletesen tárgyaljuk
- Gomb (Button) lenyomásával a felhasználó egy meghatározott lapra, vagy URL címre kerül, mely az információt elküldi és feldolgozza.
- Menü, amely hierarchikus navigációt tesz lehetővé.
A navigációs fülek a tartományokon kívül helyezkednek el, és a lapok közötti váltást te-szik lehetővé.

Az alkalmazás egy HTML felület, amelyik az adatbázis objektumokon alapul, úgy mint táblák és eljárások. Mindkét típusú alkalmazást (Database és WebSheet) az APEX alkalmazás létrehozó varázslóval. A fő különbség a két típusú alkalmazás között az, hogy kinek a számára készül.
Amíg az adatbázis alkalmazás a fejlesztőkhöz kapcsolódik, a Websheet alkalmazást a fejlesztési gyakorlat nélküli végfelhasználók számára tervezik


- A Database segítségével olyan adatbázis alkalmazásokat hozhatunk létre,
   amelyek lapokból állnak, a lapokat mi definiáljuk, biztonságossá tudjuk tenni,
   specifikálhatjuk a felhasználói felületet. A lapokon táblák, lekérdezések
   és parancsok eredményei találhatóak. Az alkalmazás létrehozásához szükség
   van SQL és PL/SQL programozás ismeretére.

- Táblázatos adatokra (Websheet) építve hozhatunk létre alkalmazásokat úgy,
    hogy az tartalmazza az adatok betöltését az adatbázis-kezelőbe,
majd egy alapértelmezett riportkészítő és adatszerkesztő alkalmazást állít elő,
melyet később igény szerint lehet testre szabni, átalakítani.
Az alkalmazás használható lesz az új táblán keresztül történő lekérdezésekre,
beszúrásra, módosításra és az analitikus függvények használatára.
Használatához nem szükséges SQL programozás ismerete.

- A Packaged Application az úgynevezett csomagolt alkalmazások létrehozására szolgál.
    Egy alkalmazás importálása és installálása bonyolult folyamat.
Első lépése a cél adatbázis objektumok és kiinduló adatok létrehozása.
Második lépés az installálása és minden képeket, sablonokat tartalmazó,
valamint más statikus fájlok installálása.

A csomagolt alkalmazás használata nagyon egyszerű folyamat.
A számos lépéssorozat helyett, meghatározhatjuk a támogatott objektumokat,
úgy, hogy az alkalmazást és a szükséges fájlokat áttelepítjük néhány lépés segítségével.

Ezt a néhány lépést valósítja meg e kategória.
- Az alkalmazás létrehozás feltételei (Create Option) szövegmezőben választhatunk:
- Indulás a legelejéről (Start from scratch)
- Tartalmazza a kezdőlapot (Include Home Page)
Include Home Page választás esetén az első lapunk az úgynevezett home lap.
Ennek tetején fülek nélkül is elérhető bármelyik itt létrehozott lap,
de akármelyik lapról csak a home lap érhető el. E sáv felett helyezkedik el a Fülek sora.

Válasszuk Start from scratch, és a Desktop beállítást, majd Kattintsunk a Next gombra.
A megjelenő ablakban kiválaszthatjuk alkalmazásunk elsőként létrehozandó lapjának típusát

 A lap típusa lehet:

-Blank : üres, nincs beépített funkciója,
-Report: egy lekérdezés formázott eredménye,
-Form: a forrás adattábla egy sora jelenik meg módosítás céljából,
-Tabular Form: a forrás adattábla több sorát lehet módosítani, törölni,és beszúrni
(a táblának Elsődleges kulcs, azaz Primary Key megszorítással
kell rendelkeznie),
Report and Form: ez a lap típus két lap a Report és a Form kombinációjából épül fel.
Az első lapon a felhasználó kiválaszt egy módosítandó sort, a második lapon módosítani
tudja a kiválasztott táblát vagy nézetet. A forrás adattáblának és az itt szereplő
Tabular Form-nak Elsődleges kulcs megszorítással kell rendelkeznie.
-Master Detail
-Chart: Grafikon laptípus.


Alkalmazás generálás előtt az Authentication Scheme esetén három választásunk van:
- APEX azonosítás (Application Express Authentication), ekkor egy vir-tuális felhasználó jön létre,
- nincs belépési jelszó (No Authentication), ekkor a belépés nyilvános,
- az adatbázis jelszavával léphetünk be (Database Account), ekkor saját jogon érjük el az adatbázis motort.

  -  Tabs  mezőben szintén három lehetőségünk van:

- No Tabs ne legyenek fülek
- One Level Tabs egy szintű fülek legyenek
- Two Level Tabs kétszintű  fülsor legyen.

  - A Nyelv (Language) mezőben válasszuk a magyar nyelvet.
  - Dátum és idő formátumot megválaszthatjuk, de nem kötelező.
Ezután kattintsunk a Next gombra.

A megjelenő ablakban választhatunk megjelenítési Felület Mintát (Theme).
Ez azt határozza meg, hogy milyen legyen a felhasználói felület általános kinézete,
színe, a fülek pozíciója, a kilépés helye, stb.

 - Lap (Page) felépítése, szerkesztése

A lap tulajdonképpen felhasználói funkcióknak szánt lapra mely egy html kód által
generált windows ablak.

Nincs mérete, a nyomtatás a szokásos Page Setup segítségével történhet.
A legfelső sorban láthatjuk a felhasználó számára megengedett tevékenységeket.

Alatta a Visszalépő Sáv (Breadcrumb) mindig megjelenik minden egyes lap tetején
az Application Builderben annak érdekében hogy a lapok közötti navigációs út létrejöjjön.
Kialakítással egy másik lapra lehet navigálni a segítségével ahogy a Visszalépő Sáv
megfelelő belépési pontjára kattintunk.



Lap (Page) ablak komponens nézetében az alkalmazói lapokat meghatározó objektumok
három oszlopba csoportosítva láthatóak.

- Baloldali oszlop:
Lap-Megjelenítési csoport (Page Rendering). Itt találhatóak a Lap (Page) tu-lajdonságait és megjelenését meghatározó komponensek, valamint Tartományokat (Regions), Gombokat (Buttons), Elemeket (Items), valamint a megjelenítés-hez kapcsolódó, úgynevezett Lapszintű Számítási Folyamatokat (Computations) és Lapszintű Általános Folyamatokat (Processes) valamint Lapszintű Dinamikus Tevékenységeket (Dynamic Actions) lehet itt létrehozni és módosítani.

- Középső oszlop:
Folyamat-Definíciós csoport (Page Processing). Itt találhatóak a lap használatához, alkalmazási logikájához kapcsolódó komponensek, az úgynevezett Alkalmazásszintű Számítási Folyamatok (Computations), a Validációs Adatok (Validations), az Alkalmazásszintű Általános Folyamatok (Processes), va-lamint a Kapcsolati Folyamatok (Branches).

Az itt szereplő Számítási és Általános Folyamatok gyakran tartalmaznak valamilyen SQL, vagy PL/SQL utasítást, általában a Validációs Adatokkal adjuk meg az adatbevitelhez az ellenőrzési feltételeket, a Kapcsolati Folyamatok segítségével pedig a megjelenítendő új (alkalmazásbeli, vagy külső, URL-címével adott) lapot jelöljük ki.

- Jobboldali oszlop:
Megosztott komponensek csoportja (Shared Components). Itt hozhatók létre, il-letve módosíthatóak a Fülek (Tabs), az Érték Listák (Lists of Values), a Visz-szalépő Sáv (Breadcrumbs), a Listák (Lists), a Felület Minta (Theme), a Sab-lonok (Templates), a Hitelesítés (Security) és a Navigációs Sáv (Naviga-tion Bar).
Ezeket a komponenseket az alkalmazás minden lapja eléri, közösen használhatják (tehát bármelyik lap definíciós ablakából szerkeszthetjük.

A lapokon minden komponens látható és szerkeszthető. Másolni lehet egy komponenst az egyik lapról a másikra. Az aktuális lapra lehet új komponenst is helyezni.


A fa szerkezetű nézet 

megjeleníti a tartományokat, a lap elemeit, az alkalmazási logikát, mint a facsoport csomópontjai. A fa csoport minden komponense az események sorrendjén alapul, vagyis az APEX folyamatai hogyan hajtják végre a lap előkészítését, és a végrehajtást. mindkét nézeten kialakítható és változtatható a felhasználói felület.

Tartomány létrehozása

A lapon létrehozhatunk tartományokat (region), amelyek kiválasztott sablont használnak, és html tartalmat generálnak. Egy lapon több tartomány is létrehozható. A tartomány a komponensek csoportjának gyűjtőhelye, például szövegeket, riportokat, gombokat, és egyéb Elemeket tartalmazhat. Készíthetünk egyszerű tartományt is, amely nem készít kiegészítő html kódot, és készíthetünk szépen kidolgozott tartományt, amely lefordítja a tartalmat és kiegészítő html kódot készít.
Nézzünk egy példát. Kattintsunk a Page Definition lapon a Page Rendering oszlop Regions szekciójában a Létrehozás (Create) funkciójú + ikonra.




A következő típusú tartományok választhatók :
1. HTML: Az Elemek gyűjtőhelyeként funkcionál, és magába foglalja azokat a html tartalmakat, amelyekkel elláttuk.
Lehet html szöveg, amely helyettesítő és speciális karaktereket tartalmaz.

2. Report: SQL lekérdezések eredményét, vagy varázslóval előállított SQL lekérdezéseket állít elő, amelyeket nem nekünk kell megírni, és ennek eredményét jeleníti meg..
A többit nem részletezzük, mert az egyes tartomány típusokat szemléltető képek elég egyértelműek



Riportok, Tábla-megjelenítés

Jelenítsük meg az emp tábla tartalmát az alkalmazásunk első lapján.
Első lépésként válasszuk a megfelelő  Report tartományt, a megjelenő lehetőségek közül.



 A választható tartományok


- Interaktív riport (Interactive Report)
Az interaktív riport  általunk írt SQL lekérdezésen alapuló interaktív riportot készít. Az SQL lekérdezés segítségére használjuk a Lekérdezés Varázslót (QueryBuilder). Ez a riport csak a munkaállomáson futó (desktop) lapon támogatott, és laponként csak egy interaktív riportot határozhatunk meg. A végfelhasználó testre szabhatja a riport elrendezését, és az adatok az Action menüből kiválasztott opciónak megfelelően jelennek meg.
A riport megjelenése az előre elkészített riport sablon alapján történik, amelyben karaktersorozat szerinti szűrés megvalósítható.

- Klasszikus riport (Classic Report)
A Klasszikus riport a szokásos SQL lekérdezésen vagy olyan PL/SQL függvényen alapszik, amelyik egy SQL utasírtással tér vissza. Az SQL lekérdezés előállítására se-gítségül használjuk a Lekérdezés Varázslót.

- Web szolgáltatás eredménye (Web Service Report)
A riport a Webszolgáltatás eredményén alapul.

- RiportVarázsló (Wizard Report)
A riportot a hagyományos SQL lekérdezés varázslóval állítja elő, amelyhez nem szükséges SQL ismeret.Kiválaszthatjuk a megfelelő sémát, táblát oszlopokat és az eredmény megjelenését.

Válasszuk első esetben a legegyszerűbb riportkészítést a varázslóval:
A varázsló első lépésében meg kell adni a riport Fejlécét (Title), és a sorozatszámát (Sequence). A többi választható

Elemek (Items)
Az APEX-ben az Elemek (Items) a felhasználó és az alkalmazás közötti információát-adásra szolgáló
kommunikációs (adatbeviteli, adatmegjelenítő) eszközök. Ezek a (html) Lapok Tartományaiban
helyezkednek el. Egyebek mellett ezek szolgálnak a felhasználó azonosításra, az alkalmazás
munkafolyamataihoz szükséges adatok bevitelére, listák megjelenítésére, stb.
Ennek megfelelően lehetnek text mezők, jelszó mezők, combobox, checkbox és így tovább.

Az Elemeknek két típusa van:
- Page items: Lap-Elemek. Ezek a Lapokon találhatók, és valamilyen adat beírására,
     kiválasztására, megjelenítésére szolgálnak. A továbbiakban ezekkel foglalkozunk.
- Application items: Alkalmazás-Elemek. Ezek nincsenek laphoz társítva, az alkalmazás
     egészére vonatkozó tulajdonságok beállításá-ra szolgáló eszközök, a felhasználói felületen
nem látható-ak. Úgy használjuk azokat, mint globális változók.

Elemek típusai
Az alábbiakban áttekintjük a Lap-Elemek (továbbiakban egyszerűen csak Elemek) főbb tipusait,
és használatukat.
Egy Elem létrehozását oly módon kezdeményezhetjük, hogy a létrehozandó alkalmazás általunk
kiválasztott lapjának Lap-Definíciós (Page Definition) ablakában oldalán az Items szekcióban
a Create (+) jelre kattintunk

Az Elemek a használatuk és az alapvető tulajdonságaik szerint lehetnek
  úgynevezett Combobox
  és nem-Combobox típusúak.

 A Combobox típusú elemek esetén valamilyen előre megadott listából választhatunk ki
 egy vagy több megfelelő értéket,
 míg a nem Combobox típusúak egyszerű szövegbevitelre, illetve -megjelenítésre szolgálnak.

 A Combobox típusú elemek például a Check Box, a List Manager, a Popup List, a Radio,
 a Select List, míg nem-Combobox típusuak a Text,
a TextArea, a Password, a File Browse, stb.


Hivatkozás Elemekre
Az Elemekre az alkalmazásban a következőképpen hivatkozhatunk
(mely hivatkozás az Elem tartalmának beágyazását eredményezi):
-SQL, PL/SQL esetén: a környezeti változóra való hivatkozás módján (:Elemnév),
-Statikus szövegben: &Elemnév. (a végén ponttal!).

Új Elem létrehozása
Attól függően, hogy a fentiekben bemutatott első lépésben milyen Elemet választunk ki,
más és más tulajdonságokat (attribútumokat) lehet beállítani.
A rendszer által felajánlott PN_X, névben N az aktuális lap azonosítója (például a 2. lap
esetén ez a P2, ezt célszerű elfogadni), az X helyébe pedig írjunk be valamilyen,
az Elem funkcióját tükröző azonosító nevet.
A különböző típusú Elemek létrehozásának lépései hasonlóak. Nem minden tulajdonságot
kell minden Elemtipusnál beállítani, de vannak olyan adatok (például az elhelyezkedés
tartománya, a megjelenítendő értékek forrása, stb.), melyeket minden esetben meg kell adni.

A kiválasztott Elem tulajdonságai utólag is szerkeszthetők.
Az egyes tulajdonságok mind a létrehozás során, mind az utólagos beállításnál csoportosítva jelennek meg. Az alábbiak-ban az utólagos módosításnál (az Edit Page Item ablakban) szereplő fontosabb tulaj-donság-csoportokat (4.18. ábra) mutatjuk be. Megjegyezzük, hogy ezek nem mindegyike értelmezhető minden Elemnél!

Elemek külalakjának megváltoztatása:
- Az elemek betűvastagságának megváltoztatása:
a HTML Form Element Attributes mezőbe beírjuk: class="fielddatabold" szöveget.
- Statikus szöveg megjelenítése esetén a Forrás (Source)ablakba a tartomány forrása
(Region Source) szövegablakba a megfelelő HTML kódú szöveget írjuk be, természetesen
java szkrip is lehetséges ill XML forrás is.


Méretváltoztatás:


<span style="FONT-SIZE: 16pt"> Első sor. </span>

Soremelés
<br>
<span style="FONT-SIZE: 24pt"> Második sor. </span>
<br>

Színváltoztatás:
<font size= "20" font color="red">Harmadik sor!</font>

Szöveg fekete, ha az egérrel fölé megyünk piros lesz
<tr>
<td onmouseover="this.style.color = 'red'" onmouseout="this.style.color = 'black'"> Negyedik sor </td>
</tr><br>


- Paraméterezett (dinamikus) riport készítése


Dinamikus listázásról beszélünk, ha a listázó utasítás valamely paramétere az alkalmazás
egy futásközbeni értéke, vagy egy, a felhasználó által megadott paraméter.
Az alábbiakban bemutatjuk az ilyen listák létrehozásának, és egyben a környezeti változók
használa-tának módját, lépéseit.

A felhasználói értékkijelölés számára egy legördülő listát
hozunk létre, az ebben kiválasztott érték jóváhagyására pedig egy gombot.

1. Hozzunk létre először egy html tartományt (Region) a lista és a gomb elhelyezésére.
Amennyiben ezt Fa szerkezetben tettük meg, akkor utána már erre a regióra állva
és a jobb gombra kattintva tudjuk a további Elemeket létrehozni.

2. Hozzuk létre a legördülő listát. Ennek érdekében az Items szekcióban a
Create (plusz jelű) ikonra kattintva elindítjuk az Elem létrehozó varázslót.
Itt válasszuk a Select List elemet.

Riport fejlécének módosítása

A korábban elkészült riport fejlécének módosítása érdekében Szerkesszük a riportot.
Kat-tintsunk a Lap Definíciós (Page Definition) ablak Tartomány-Definiáló részében (Regions)
A dolgozók foglalkozás szerinti listája nevű riport hiperhivatkozására,
majd a Report Attributes fülre.


- "no data found" hibaüzenet kiküszöbölése.

Az alapfeladat, hogy milyen módon lehet elérni azt, hogy egy riport addig ne jelenjen meg,
amíg a hozzárendelt listát aktivizáló tevékenységet (jellemzően gombra való kattintást)
legalább egyszer el nem végeztük. Ez egy olyan feltételbeállítás,
amelyikről egy lap első megjelenítésekor kell gondoskodni, egyébként a riport helyén
a no data found hibaüze-net jelenik meg.

Kattintsunk a Lap-Definíciós (Page Definition) ablak a Tartomány-Definiáló (Regions)
szekciójában a A tábla szerinti listája nevű riport hiperhivatkozására.
A megjelenő ablak a Megjelenítési Feltétel (Conditional Disp-lay) szekciójában
előbb állítsuk be a Feltétel Típusát (Condition Type).

Mivel a Szűrés gomb lenyomásához szeretnénk a riport megjelenítését hozzárendelni,
ezért feltételként e gomb azonosító (REQUEST) értékét adjuk meg a feltételben.
Az ehhez tartozó Feltétel Típus tehát a Value of Item/ Column in Expression1 is NOT NULL,
és a Kifejezéshez (Expression 1) pedig írjuk be a használt legördülő lista nevét.

Alkalmazzuk a módosításokat (Apply Changes). Ekkor a programunk már valóban hibátlanul működik.
 A riport helyén most már sem az alkalmazás indításakor, sem a harmadik lap későbbi
 megjelenítésekor nem jelenik meg hibaüzenet.


Elágazás (Branches)

Az Elágazás ,(Branch) egy olyan utasítás, amely kijelöli, hogy a vezérlés melyik lapra, eljárásra vagy URL-címre adódjon át.

Egy új Elágazást (Branch) a szekciójának varázslójával lehet létrehozni. Ennek során egyrészt meg kell adni azt, hogy az Elágazás az alkalmazás működésének mely pontján aktivizálható (Branch Point), valamint az Elágazás típusát (Branch Type). A létrehozott  Elágazás típusa meghatározza a Branch típusát is.

Aktivizálási Pont és Tevékenység

Ha az alkalmazásban alapértelmezett Fülre kattintunk, akkor az APEX motor megállapítja a session stateet, végrehajtja a számításokat és átkapcsol a cél Lapra. Nem futtat le semmilyen folyamatot, vagy explicit meghatározott elágazást. Abban az esetben , amikor a Lap végrehajtódik anélkül, hogy Fülre kattintottunk volna, az APEX motor egyértelműen meghatározza azt az elágazást, amely közvetlenül a felhasználótól érkezett.

Az Elágazás (Branch) feltétele:

Mint más vezérlőnek az Elágazásnak is adhatunk feltételt. A feltétel megadása esetén, ki kell választanunk a feltétel típusa listából egy megfelelő feltételt, és az Expression mezőbe be kell írni a szöveget, amely megvalósítja a változáshoz a feltétel típusát.


Az aktivizálási pont (Branch Point) lehet:
- On Submit: Before Computation beállítás esetén a megjelenítési továbblépés bármilyen Számítási Folyamat végrehajtása (például a bevitt adat ellenőrzése) előtt történik. Jellemzően ezt használjuk olyan gomboknál, amelyeknél nincs szükség semmilyen feldolgozási folyamatra (például a Cancel gomb).
- On Submit: Before Validation beállítás esetén, ha az adatellenőrzés hibát állapít meg, akkor az adatbevitel érvényesítése helyett a megjelenítés egy hibaüzenettel visszatér az adatbevitelhez.
- On Submit: Before Processing beállítás esetén a megjelenítési továbblépés az adatellenőrzés és a tényleges adatbevitel után történik, de az alkalmazás további folyamatai előtt.
- On Submit: After Processing beállítás esetén a megjelenítési továbblépés az alkalmazás teljes aktuális feldolgozási folyamata után történik.
- On Load: Before Header beállítás esetén az alkalmazási logika szerint következő lap betöltése helyett egy másik (alkalmazásbeli, vagy külső, URL-címével adott) lapot jelöl ki megjelenítésre.



Az Elágazás típusától függően kiválasztható a következő: hozzáadandó tevékenység  tulajdonságaira vonatkozó információ:
- Az a Lapszám, amelyre elágazni kívánunk
- PL/SQL eljárás, amely végül is előkészíti az elágazást a cél Lapra
- URL cím



Munkamenet (Session State)

A munkamenet (session) a számítógép-hálózatoknál két számítógép közötti kommunikáció, mely során az egyik (vagy mindkét) gép átmenetileg adatokat tárol a másikról; ennek segítségével egy állapotmentes protokollon keresztül is lehet állapotokat megőrizve kommunikálni.

Amikor a felhasználó belép az Oracle Application Express rendszerbe, akkor megkezd egy munkafolyamatot – ezt nevezzük munkamenetnek –, és ez mindaddig tart, amíg a munkát be nem fejezi, azaz ki nem lép.

Mivel az OracleApplication Express egy webes eszköz, így a felhasználó a bizalmas adataival az interneten keresztül kommunikál az Oracle Application Express szerverrel. Ezt a folyamatot tehát fokozott védelemmel kell ellátni, és a munkamenet felügyeletének keretében az Oracle APEX erről a védelemről is gondoskodik.


Az Oracle Application Express maga alakítja ki, építi fel a munkamenetet, és minden munkamenet egy egyedi azonosító számot kap. Például amikor egy felhasználó elindít egy alkalmazást, kap egy azonosítót. Ez az azonosító szám segíti a ki- és bejelentkezést. Minden bejelentkezéskor, az autentikációnál új azonosítót kap, de minden lap küldése és az adat-postázás is megváltoztatja a munkamenet azonosítóját. Ez a változtatás rugalmasságot és titkosságot biztosít a felhasználónak.

A felhasználó azonosítása két eszközzel történik; az adatbázisban tárolt Munkameneti Rekorddal (Session Record), és a felhasználó gépén tárolt Munkameneti Adatfájllal (Sessi-on Cookie).

A Munkameneti Rekord a munka teljes időtartama alatt az adatbázisban található, és még a munka befejezte után is egy ideig. (Így az ügyfél a kilépés után még újabb autentikáció nélkül visszaléphet az alkalmazásába.) A Munkameneti Adatfájl tartalmazza a felhasználó korábbi munkáinak legfontosabb adatait, gyorsítva ezzel az újbóli belépés utáni munkát.

A Munkamenet tárolja a hivatkozható adatokat.



Így különböző hivatkozásokban , melyeket a session őriz
SQL : Elemem Max 30 karakter hosszú lehet
: "Elemem" speciális, vagy unicode karakterek esetén, ekkor az e
lem nevét Dupla idézőjelbe kell elrejteni
PL/SQL V(ELEM) PL/SQL szintaxisban használjuk az elemre való hivatkozás
esetén a V függvényt.
PL/SQL NV(ELEM) PL/SQL szintaxisban használjuk számokat tartalmazó elem
esetén az NV függvényt.
StaticText &ELEM Statikus szöveg esetén  használjuk a konvencionális
&Item_Név hivatkozást.
  Speciális karakterek esetén
&"ELEM" A hivatkozás speciális karakter, unikode esetén Dupla
idézőjel ( " ")közé kell rejtenünk

Amikor a felhasználó Elküld feldolgozásra egy lapot (submit) , akkor az Application Express motor automatikusan eltárolja az elemek értékét a session state-ben.

Például: Van egy két lapos alkalmazásunk.Az első lap tartalmazza a formon a felhasználó által beírt egy telefonszámot. Ezt a elemet elnevezte a felhasználó P2_telefonnak.

A második lapon meg szertnénk jeleníteni ezt a telefonszámot. Amikor a lap végrehajtásra kerül az Application Express foglyul ejti ezt az általunk beírt telefonszámot, és eltárol-ja. A felhasználó által beírt telefonszám olvasható a session state által, amely az elemre hivatkozva társul a lap mezejéhez és megjeleníti azt.

A Munkamenet törölhető.  A fejlesztés közben azt találhatjuk, hogy a lapon specifikált elemek, az alkalmazás minden lapja, vagy az aktuális felhasználói munkamenet törölhető (clear).Egy Cached érték törlése után értéke null lesz.

A munkamenettel kapcsolatban számos információ magában az alkalmazás URL-Címében található


Az APEX URL-cím felépítése:

http://LocalHost:Port/APEX/HomeLink
ahol a http://LocalHost:Port/APEX egy IP-cím, mely azonosítja az adatbázis-szervert, a HomeLink pedig magát az alkalmazást.

A HomeLink felépítése:
f?p=App:Page:Session

ahol a kettőspontok (:) az egyes szintaktikai elmeket választják el, és például a
f?p= 104:3:8496424035033::NO:::
esetben 104 jelöli az alkalmazás (App) azonosítóját, 3 a lapszámot (Page), és a munka-menet (Session) azonosítóját pedig a 8496424035033 számsorozat.

A munkamenet azonosítóját még további öt paraméter követheti (melyek hiánya esetén is az elválasztó kettőspontok szerepelnek). Ezek a Request, a Debug, a ClearCache, az itemNames, az itemValues és a PrinterFriendly



Ezek jelentése:
Request a lapváltási eseményt kiváltó gomb azonosítója (Button Request),
Debug NO vagy YES a hibakövetési információ megjelenítési mód (NO esetén nem jelenik meg hibakövetési információ),
ClearCache megadja hogy melyik oldal gyorsmemóriáját törli,
itemNames az olyan elemnevek vesszővel elválasztott listája, amelyek beál-lítják a munkamenet állapotát,
itemValues az előzőekben megadott elemnevekhez tartozó értékek vessző-vel elválasztott listája,
PrinterFriendly az adott lap nyomtatásának engedélyezése (YES, vagy NO).


Kiszámító Folyamatok (Computations)

A Kiszámító Folyamat (Computation) egy számítási eljárást rendel hozzá egy (és csak egy) Elemhez (Item). Gyakran használjuk oly módon, hogy egy Elem típusú gombbal aktivizálunk egy Kiszámító Folyamatot, melynek eredménye például egy szövegmezőben megjelenő érték.

Létrehozhatunk Lapszintű Kiszámító Folyamatot, mely a lap megjelenéséhez kapcsoló-dik (Page Rendering), és Alkalmazásszintű Kiszámító Folyamatot, amely a lap feldol-gozása során (az alkalmazás logikájához kapcsolódóan) hajtódik végre (Page Processing).

Az Alkalmazás szintű Kiszámító  Folyamat egy logokai egység egy egyszerű lap vagy al-kalmazás-szintű elem értékét állítja be, és ezek a beállított pontok az alkalmazás több pontján futnak keresztül.
Mina Lapszintű mind az Alkalmazás-szintű kiszámító Folyamat alapiulhat SQL, lekér-dezésen, PL/SQL programon, elem- vagy statikus értéken.

Ez utóbbi eset úgy állítható be, hogy a Kiszámító Folyamat létrehozásakor, vagy szer-kesztésekor a Computational Point mezőt After Submit értékűre választjuk. Ek-kor a Kiszámító Folyamat a Lap-Definíciós (Page Definition) ablak Folyamat-Definíciós csoportjában (Page Processing) jelenik meg. Minden egyéb értékválasztás esetén a Kiszámító Folyamat lapszintű lesz, aminek megfelelően a Lap-Megjelenítési (Page Rendering) csoportban jelenik meg.


Alkalmazászintű Kiszámító Folyamat

Az Alkalmazásszintű Kiszámító Folyamat általános használata, hogy az utolsó látható lap értékét tárolja. Egy elem értékének eltárolásával a visszatérő gombhoz adható, és azo-kat a felhasználó átirányíthatja a Kiszámító Folyamat által zsákmányolt lapszámra.
Ez a folyamat igen jól dolgozik , abban az esetben amikor az engedélyezett felhsználónak szüksége van egy hibás lap utáni visszatérésre.
Példa
Az utolsó lap számát tároljuk el egy elemben, ennek neve legyen UTOLSO_LAP
A hozzá tartozó Lapszintű Kiszámító Folyamat programtörzse pedig:

BEGIN
  :UTOLSO_LAP := NVL(:AKTUALIS_LAP, :APP_PAGE_ID);
  :AKTUALI_LAP := :APP_PAGE_ID;
  :RETURN :UTOLSO_LAP;
END;

Létrehozása a Megosztott (Shared)komponensben történik.


Lapszintű Kiszámító Folyamat :

A végrehajtási pontok (Computation Point) az alábbiak lehetnek:
Before Header: A Kiszámító Folyamat végrehajtódik a lap megjelenítése előtt.
After Header A közvetlenül a fejléc megjelenése után.
Before Region(s) A Kiszámító Folyamat végrehajtódik mielőtt a tartomány
megjelenik
After Region(s) A Kiszámító Folyamat végrehajtódik miután a tartomány
megjelenik
Before Footer A Kiszámító Folyamat végrehajtódik a tartomány megjelenése után, de a lábléc megjelenése előtt
After Footer A Kiszámító Folyamat végrehajtódik a tartomány után,
de a lábléc megjelenése után.
After Submit A Kiszámító Folyamat végrehajtódik a lap feldolgozása után.
A Kiszámító Folyamat (Computation Type) típusai:
Static Assignment: Konstans érték hozzárendelése
PL/SQL Function Body: PL/SQL függvény törzs
SQL Query(return single value): SQL lekérdezés (egyszerű érték tér vissza)
SQL Query(return colon separeted value) SQL lekérdezés ( visszatér vesszővel elválasztott értékkel
SQL Expression: SQL kifejezés
PL/SQL Expression: PL/SQL kifejezés
Item Value: Elem visszatérési értéke




Általános Folyamatok (Processes)

Az Általános Folyamat (vagy röviden Folyamatok) egy olyan PL/SQL nyelven írt eljárás, mely valamilyen eseményre aktivizálódik. Ilyen esemény lehet egy gombra való kattintás, egy kiválasztás, egy lap betöltése, vagy átirányítása, egy munkafolyamat visszaállítása, vagy egy táblabeli sor automatikus feldolgozása.

Az Általános Folyamatok is kétfélék lehetnek, Lapszintűek (Page Rendering), me-lyek a lap megjelenéséhez kapcsolódnak, és Alkalmazásszintűek (Page Processing), melyek a már megjelent lapon egy esemény bekövetkezésére végzik a lap feldolgozását az alkalmazás logikájának megfelelően.
Folyamatokat tehát létrehozhatunk mind a Lap-Megjelenítési csoportban (Page Rende¬ring), mind a Folyamat-Szerkesztő csoportban (Page Processing).valamint a Megosztott (Shared) komponensek eszköz segítségével

Az, hogy végül is hol fogjuk látni, a létrehozási paraméterek beállításától függ. A létrehozást a Process szekció Create (+ jelű) ikonnal kell elindítani.

A létrehozás során először a folyamat kategória  típusát kell kiválasztanunk.


Egy általunk létrehozott PL/SQL programot lefuttat. Ezt a folyamat típust használ-juk, amikor egy PL/SQL blokkból indítunk egy folyamatot, vagy egy API eljárást.

Reset Pagination
Visszaállítja a riport tartományban az eredményhalmazt. Az APEX motor  nyomon követi a felhasználó tevékenységeit a riporton , és ez a kategória visszaállítja a kezdeti eredményhalmazt.

Plug ins
Beépülő modul: megengedi a fejlesztést deklarativ módon kiterjesztett APEX által elérhető modulokkal. Ez az opció akkor érhető el, ha plug-in típusú folyamat létezik az alkalmazásban

Session State
A munkamenet elem értékét inicializálja (nullára állítja). E folyamat választása az alkalmazási munkamenetek vagy elemek gyorsítótárát (cache) törli, valamint törli a felhasználói beállításokat.


Data Manipulation

A varázsló által gyakran használt adatmódosítási folyamatok:
Létrehozás (Create) érdekében automatikus sor lehívás (Automatic Row Fetch), és automatikus sor folyamat (Automatic Row Process).
A táblázatos formában (tabular form) több sor módosítása (Multi Row Update) és több sor törlése (Multi Row Delete)
Új sor hozzákapcsolása a táblázatos formához (Add Row to Tabular Form)

Close Popup Window
Ennek végrehajtása során bezárja a felugró (popup) ablakot és a hívó ablakot frissíti.

Form Pagination
Lapozást valósít meg a master-detail form és a detail rekordok között.

Send E-Mail
Deklarált interface-t szolgáltat APEX_MAIL.SEND_MAIL számára.Ez a folyamat típus támogatja a csatolást.

Web Service
A lapon folyamatként valósít meg egy web szervert.

Run On Demand Process
Létrehoz egy alkalmazás szintű folyamatot, amely csak akkor hajtódik végre, amikor egy speciális lapot hív. Ha ezt Lapszintű Folyamatnál hozzuk létre, akkor egy referenciát adhatunk meg egy már létező Alkalmazásszintű Folyamathoz.

Figyeljünk arra, hogy a PL/SQL programot lezáró end; után üres sor ne legyen !!






Megjegyzések