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;
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:
- Lekéri a legmagasabb fizetéssel rendelkező dolgozó fizetését.
- Kiszámolja és megjeleníti ennek a dolgozónak az éves fizetését.