Adatbázisok szerver oldali programozása Előadás, 2006.02.24.

A VIK Wikiből

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>


<< Előadás, 2006.02.24. >>

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 az
      ORDER BY
      -t és a
      rownum<=5
      -öt. (tehát először kapjuk meg a rendezetlen tábla első öt sorát, majd az
      ORDER BY
      csak a lekért rendezetlen öt sort rendezi) SELECT * FROM (


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


(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


(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'=

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

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 ...;


=SELECT id,id2 INTO szam3,szam4 FROM ...;
A

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


utasítások;
END 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.

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.