Adatbázisok szerver oldali programozása Előadás, 2006.02.24.
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
<style> code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;} li { line-height: 18px; } </style>
Oracle és Sql Server 2005 közötti különbségek
- String összefűzés
- Oracle: =SELECT vezetéknév ||| ' ' || keresztnév FROM felhasználók=
- MS SQL: =SELECT vezetéknév + ' ' + keresztnév FROM felhasználók=
Szám és string összefűzésénél a számot először konvertálni kell: =CONVERT(varchar, oszlopnév)=
- =NULL= érték kezelés
- Oracle: =NVL(oszlop, érték)=
- MS SQL: =ISNULL(oszlop, érték)=
- Aktuális dátum
- Oracle: =SELECT sysdate FROM DUAL=
A =DUAL= egy 1 soros beépített tábla. Oracle-ben nem hagyható el a =SELECT= mögül a =FROM=, ezért kell trükközni.
- MS SQL: =SELECT getdate()=
- Stringből dátum
- Oracle: =INSERT INTO tábla VALUES(TO_DATE('2006-02-24', 'yyyy-mm-dd'))=
- MS SQL: automatikusan konvertál stringből, többféle formátumot felismer (pl. '2006-02-24')
- Első 5 sor
- Oracle: =rownum<=5=. Operátorként itt csak < és <= megengedett. Ha egy táblának kérjük valamilyen rendezés (
ORDER BY ...
) szerinti első néhány sorát, a rendezést allekérdezébe (beágyazott lekérdezésbe) kell rakni, mert különben fordított sorrendben értékeli ki azORDER BY
-t és arownum<=5
-öt. (tehát először kapjuk meg a rendezetlen tábla első öt sorát, majd azORDER BY
csak a lekért rendezetlen öt sort rendezi)SELECT * FROM (
- Oracle: =rownum<=5=. Operátorként itt csak < és <= megengedett. Ha egy táblának kérjük valamilyen rendezés (
SELECT id, name
FROM students ORDER BY name) a
WHERE rownum<=5
- MS SQL: =SELECT TOP 5 id, name FROM student ORDER BY name=
- Intervallum kiválasztása
- Oracle:
SELECT * FROM
- Oracle:
(SELECT id, name FROM student ORDER BY name) a
WHERE rownum<=10
MINUS
SELECT * FROM
(SELECT id, name FROM student ORDER BY name) b
WHERE rownum<=5
- MS SQL:
SELECT * FROM
- MS SQL:
(SELECT TOP 10 id, name FROM student ORDER BY név) a
EXCEPT
SELECT * FROM
(SELECT TOP 5 id, name FROM student ORDER BY név) b
- Táblanevek lekérdezése
- Oracle: =SELECT table_name FROM user_tables=
- MS SQL: =sp_tables=
- Logolás
- Oracle: =DBMS_OUTPUT.PUT_LINE('a')=
- MS SQL: =print 'a'=
- Azonosító generálás (primary key oszlop automatikus generálása):
PL/SQL
Tárolt eljárások
Az Oracle-ben minden utasítást blokkba kell zárni. Az utasításokat és a blokkokat pontosvessző zárja le.
Anonim blokk
[<<cimke>>]
[DECLARE
változó deklaráció, lokális eljárások]
BEGIN
utasítások, blokkok
[EXCEPTION
kivételkezelés]
END;
Eljárás
PROCEDURE név(paraméterek)
[IS
...]
BEGIN
...
[EXCEPTION
...]
END;
Függvény
<coe class="pre">FUNCTION név(paraméterek) RETURN típus [IS ...] BEGIN ... [EXCEPTION ...] END;
Komment
- Egysoros: =--=
- Többsoros: =/* */=, nem ágyazhatók egymásba
Változók
- azonosító: [a-zA-Z][a-zA-Z0-9$_]*, nem case sensitive és legfeljebb 30 hosszú. Ha az azonosító ettől különböző formájú, idézőjelek közé kell tenni. A hosszba az idézőjeleket is bele kell számolni.
- deklaráció: ha nem adunk meg kezdőértéket,
NULL
-t vesz fel.DECLARE
szam1 INT;
szam2 INT := 3;
szam3 INT DEFAULT 5;
datum DATE NOT NULL := '2006-FEB-12';
pi CONSTANT REAL := 3.14;
diak_nev student.stud_name%TYPE;
diak_rekord student%ROWTYPE;
- értékadás:
BEGIN
szám1 := 3;
SELECT id INTO szam2 FROM ...;
A
=SELECT id,id2 INTO szam3,szam4 FROM ...;
SELECT
-nek pontosan 1 sorral kell visszatérnie, különben
NO_DATA_FOUND
vagy
TOO_MANY_ROWS
exceptiont dob.
- névelfedés
- az SQL oszlopnév elfedi a változónevet
- a belső blokkban deklarált változó elfedi a külsőt
- az elfedett változóra cimkenév.változónév alakban tudunk hivatkozni
- változó hatásköre = a kódnak azon része, ahol tudunk rá hivatkozni
- változó láthatósága = az a blokk, amiben a változót dekaráltuk
Vezérlési szerkezetek
Minden vezérlési szerkezetet megelőzhet egy
<<cimkenév>>
formátumú cimke.
- =NULL=: üres utasítás. A blokkokban mindenképpen szerepelni kell utasításnak. Ha pl. egy tárolt eljárást nem akarunk megírni,
NULL
-t írunk a törzsébe, hogy leforduljon.
- =GOTO cimke=: nem ugorhat bele alblokkba, vagy ki a blokkból. Az =EXCEPTION= részből nem ugorhat vissza a saját blokkjába.
Elágazások
IF feltétel THEN
utasítások;
[ELSIF feltétel THEN
utasítások;]
[ELSE
utasítások;]
END IF;
- Searched case (ugyanaz, mint az =IF=)
CASE
WHEN keresési feltétel THEN
utasítások;
[ELSE
utasítások;]
END CASE;
CASE szelektor
WHEN kif THEN
utasítások;
[ELSE
utasítások;]
END CASE;
Ciklusok
A ciklusokból az =EXIT;= utasítással lehet kilépni. Feltételes kilépés: =EXIT WHEN feltétel;=.
- végtelen ciklus:
LOOP
utasítások;
END LOOP;
WHILE feltétel LOOP
utasítások;
END LOOP;
FOR változó IN [REVERSE] alsó..felső LOOP
A változó helyben van deklarálva, a hatásköre a ciklus belseje, és nem módosítható. A ciklus határai lehetnek változók, de összetett kifejezés már nem.
utasítások;
END LOOP;
Példa
Az =ember(id, név)= táblából írjuk ki a neveket. Megjegyzés: gányolunk egy kicsit, kurzorokkal sokkal szebben megoldható a feladat.
DECLARE
minid INT;
maxid INT;
db INT;
embernev ember.nev%TYPE;
BEGIN
SELECT min(id), max(id) INTO minid, maxid FROM ember;
FOR i IN minid..maxid LOOP
SELECT count(*) INTO db FROM ember WHERE id=i;
IF db=1 THEN
SELECT nev INTO embernev FROM ember WHERE id=i;
DBMS_OUTPUT.PUT_LINE(embernev);
END IF;
END LOOP;
END;
-- Peti - 2006.02.26.