Ugrás a fő tartalomhoz

PL/SQL alapok

Az Oracle PL/SQL a SQL nyelv procedurális kiterjesztése, amely lehetővé teszi a vezérlési szerkezetek (elágazások, ciklusok, kezelő utasítások) használatát. Ezáltal összetettebb logikát valósíthatunk meg adatbázison belül.

Alapvető szerkezet

Egy PL/SQL blokk 3 fő részből áll:

DECLARE
-- változók, konstansok
BEGIN
-- utasítások
EXCEPTION
-- hibakezelés (opcionális)
END;

Változók deklarálása és használata

DECLARE
v_name VARCHAR2(50) := 'Mark';
v_age NUMBER;
BEGIN
v_age := 22;
DBMS_OUTPUT.PUT_LINE('Név: ' || v_name || ', Kor: ' || v_age);
END;

Elágazások

IF - ELSIF - ELSE

DECLARE
v_grade CHAR(1) := 'B';
BEGIN
IF v_grade = 'A' THEN
DBMS_OUTPUT.PUT_LINE('Kiváló');
ELSIF v_grade = 'B' THEN
DBMS_OUTPUT.PUT_LINE('Jó');
ELSE
DBMS_OUTPUT.PUT_LINE('Egyéb');
END IF;
END;

CASE

DECLARE
v_salary NUMBER := 470000;
BEGIN
CASE
WHEN v_salary >= 500000 THEN
DBMS_OUTPUT.PUT_LINE('Magas fizetés');
WHEN v_salary >= 400000 THEN
DBMS_OUTPUT.PUT_LINE('Közepes fizetés');
ELSE
DBMS_OUTPUT.PUT_LINE('Alacsony fizetés');
END CASE;
END;

Ciklusok

LOOP

Feltétel nélkül ismétel, amíg ki nem lépünk belőle.

EXIT utasítással lehet kilépni. (WHEN után feltételt is megadhatunk.)

DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('Szám: ' || v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 5; -- kilépés
END LOOP;
END;

WHILE

A feltételt minden iteráció előtt ellenőrzi.

DECLARE
v_counter NUMBER := 1;
BEGIN
WHILE v_counter <= 5 LOOP
DBMS_OUTPUT.PUT_LINE('Szám: ' || v_counter);
v_counter := v_counter + 1;
END LOOP;
END;

FOR

Ismert ismétlésszám esetén használjuk.

BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('i = ' || i);
END LOOP;
END;

Vezérlési utasítások

  • EXIT: Kilép a ciklusból.
  • CONTINUE: A ciklus következő iterációjára ugrik.
BEGIN
FOR i IN 1..10 LOOP
IF i = 5 THEN
EXIT; -- kilépés 5-nél
END IF;
DBMS_OUTPUT.PUT_LINE('i = ' || i);
END LOOP;

FOR i IN 1..10 LOOP
IF MOD(i, 2) = 0 THEN
CONTINUE; -- kihagyja a páros számokat
END IF;
DBMS_OUTPUT.PUT_LINE('i = ' || i);
END LOOP;
END;

Adatlekérés SELECT INTO-val

PL/SQL-ben egyetlen sort tudunk változóba tölteni a SELECT ... INTO utasítással.

DECLARE
v_valtozo1 tipus;
v_valtozo2 tipus;
BEGIN
SELECT oszlop1, oszlop2
INTO v_valtozo1, v_valtozo2
FROM tabla
WHERE feltétel;

DBMS_OUTPUT.PUT_LINE(v_valtozo1 || ' ' || v_valtozo2)
END;
Figyelem!

WHERE: kötelező, mivel csak egy rekordot várunk vissza, különben hiba lesz.

Feladatok

1. Feladat

Taj-szám ellenőrzése PL/SQL-ben:

Nem kell számot bekérni, elég beégetni egy számot az ellenőrzéshez.

Szabályok:

  • A páros pozícióban álló számjegyeket 7-tel szorozzuk.
  • A páratlan pozícióban álló számjegyeket 3-mal szorozzuk.
  • Az így kapott szorzatokat összeadjuk.
  • A kapott összeg utolsó számjegyének (MOD 10) egyeznie kell a TAJ-szám 9. számjegyével.

2. Feladat

Hozz létre egy employees táblát az alábbi oszlopokkal:

  • id (NUMBER),
  • name (VARCHAR2),
  • salary (NUMBER) (havi fizetés)

Töltsd fel néhány tesztadattal. (lehet ai-t használni)

Írj PL/SQL blokkot, amely:

  1. Lekéri a legmagasabb fizetéssel rendelkező dolgozó fizetését.
  2. Kiszámolja és megjeleníti ennek a dolgozónak az éves fizetését.