Database Systems II. ZH összefoglaló 1) Kód az adatbázisban tárolva PSM CREATE PROCEDURE name(parameters) local declarations body PL/SQL CREATE (OR REPLACE) PROCEDURE name(parameters) local declarations body. run CREATE FUNCTION name(parameters) RETURNS type Paraméterek: (IN a CHAR(20), OUT b REAL, INOUT c INT) Paraméterek: (a IN CHAR(20), b OUT REAL, c IN OUT INT) Függvényhívás: CALL name(parameters); Lokális deklarációk: DECLARE name type; Lokális deklarációk: name type; Blokkok: BEGIN END; Visszatérési érték beállítása: RETURN value; Hozzárendelés: SET variable = expression; Hozzárendelés: variable := expression; Hivatkozás egy mező típusára: R.x%TYPE Tuple, ami a tábla típusait veszi fel: R%ROWTYPE IF condition THEN ELSEIF condition THEN ELSE END IF; loopname: LOOP LEAVE loopname; IF condition THEN ELSIF condition THEN ELSE END IF; <<loopname>> LOOP EXIT WHEN condition; CONTINUE WHEN condition;
WHILE condition DO END WHILE; REPEAT UNTIL condition END REPEAT; 1) Közvetlen értékadás (csak 1 érték) SET p = SELECT 2) SELECT INTO (csak 1 érték) SELECT INTO p 3) Kurzor DECLARE c CURSOR FOR query; OPEN c; FETCH FROM c INTO x1,,xn; CLOSE c; Kurzor végigjárása DECLARE NotFound CONDITION FOR SQLSTATE 02000 ; menuloop: LOOP FETCH FROM c INTO x1,,xn; IF NotFound THEN LEAVE menuloop END IF; 3) Kurzor CURSOR name IS query; OPEN c; FETCH c INTO x1,,xn; CLOSE c; Kurzor végigjárása LOOP FETCH c INTO x1,,xn; EXIT WHEN c%notfound; Tuple x R%ROWTYPE; x.attrname For ciklus FOR tmp_var IN (SELECT CURSOR) LOOP END LOOP SET SERVEROUTPUT ON; DBMS_OUTPUT.PUT_LINE(toWrite); 2) Embedded SQL A preprocessor átalakítja az SQL parancsokat függvényhívásokká. Kapcsolódás SQL szerverhez EXEC SQL CONNECT :user IDENTIFIED BY :password Deklarációs rész EXEC SQL BEGIN DECLARE SECTION; hosttype1 hostname1; hosttypen hostnamen; EXEC SQL END DECLARE SECTION;
Ha MODE=ORACLE, akkor itt nem kell a host változókat deklarálni. Ha CODE=CPP, akkor kötelező a DECLARE SECTION. A megosztott változók elé kettőspontot kell tenni. A gazdanyelvben a megosztott változók hagyományos változókként működnek. VARCHAR VARCHAR username[20]; struct { unsigned short len; unsigned char arr[20]; } username; EXEC SQL WHENEVER SQLERROR DO Kurzor A kurzor deklarációja a deklarációs részen kívülre kerül. EXEC SQL DECLARE c CURSOR FOR statement; Kurzor végigjárása: EXEC SQL OPEN CURSOR c; while ( 1 ) { EXEC SQL FETCH c INTO :var1,,:varn; if ( NOT FOUND ) {break;} } EXEC SQL CLOSE CURSOR c; SQLSTATE változó MODE=ANSI szükséges. char SQLSTATE[6]; SQL Communication Area MODE=ORACLE szükséges. Minden kifejezés visszatér egy státuszkóddal, amit az SQLCA sqlcode mezőjébe tesz. #include <sqlca.h> WHENEVER EXEC SQL WHENEVER condition action; ahol condition lehet SQLWARNING, SQLERROR, NOT FOUND és action lehet CONTINUE, DO, DO BREAK, DO CONTINUE, GOTO <label>, STOP Indikátor változók NULL értéket rendelnek bemeneti változókhoz, illetve észlelik a NULL értékeket. 2 bájtos integer (azaz short) lehet. :host_variable:indicator_variable 0 Sikeres volt a művelet. -1 NULL lett visszaadva, beillesztve vagy frissítve. -2 A karakter típusú gazdaváltozóba tett érték csonkolva lett, az eredeti hossz ismeretlen. >0 A karakter típusú gazdaváltozóba tett érték csonkolva lett, az értéke az eredeti hossz.
Dinamikus SQL Előkészítés (statement akár változó is lehet!): EXEC SQL PREPARE query_name FROM statement; Futtatás: EXEC SQL EXECUTE query_name; Összevonva: EXEC SQL EXECUTE IMMEDIATE statement; 3) JDBC ODBC (Open Database Connectivity) JDBC (Java Database Connectivity) 4 rész: Alkalmazás (indítja és leállítja a kapcsolatokat, SQL kéréseket küld) Driver manager (betölti a JDBC drivert) Driver (kapcsolódik az adatbázishoz, kéréseket küld, válaszokat és hibakódokat fogad) Adatforrás (feldolgozza az SQL utasításokat) 4-féle driver létezik: Híd Nem natív API-ba fordítja az SQL parancsokat, pl. JDBC-ODBC híd. Mind a JDBC, mind az ODBC drivernek jelen kell lennie mindkét oldalon. Közvetlen fordítás natív API-ba nem Java driverrel Az adatforrás natív API-jába fordít. OS-specifikus binary kell a klienseknél. Hálózati híd Egy közbülső szervernek küldi át a parancsokat, és ez a szerver kommunikál az adatforrással. Kicsi JDBC driver kell a klienseknél. Közvetlen fordítás natív API-ba Java driverrel A JDBC kéréseket közvetlenül a DBMS által használt hálózati protokollba fordítja. DBMS-specifikus Java driver kell a klienseknél. import java.sql.*; OracleDataSource ods = new OracleDataSource(); ods.seturl( jdbc:oracle:thin:username/password@//host:port/service ); ods.setuser(user); ods.setpassword(password); Connection mycon = ods.getconnection(); 3 kifejezésosztály: Statement: SQL kifejezést fogad és futtat. Statement stat1 = mycon.createstatement(); PreparedStatement: paraméteres SQL kifejezést fogad és futtat. PreparedStatement stat2 = mycon.preparestatement(statement); A statementben a paramétereket?-ek helyettesítik. CallableStatement: futásra kész, tárolt függvényt/eljárást futtat. CallableStatement stat3 = mycon.preparecall( {? = call name(?,?)} );
Kifejezések végrehajtása: stat1.executeupdate(statement); stat2.clearparameters(); stat2.setint(numberof?,value); int numrows = stat2.executeupdate(); Autocommit Automatikusan be van kapcsolva, kikapcsolható a con.setautocommit(boolean b) függvénnyel. Kikapcsolt állapotban tranzakció alkalmazása a conn.commit(), visszavonása a conn.rollback() függvénnyel. ResultSet ResultSet rs = stat2.executequery(); A ResultSet úgy viselkedik, mint egy kurzor. Továbblépés a következő sorra: rs.next(); Sor elemének lekérdezése: rs.gettypename(numberof? fieldname) CallableStatement Az IN paraméterek a stat3.settypename(value) metódussal állíthatók be. Az OUT paraméterek beállítása: stat3.registeroutparameter(numofoutparameter,types.sqltype); A kifejezés a stat3.execute() függvénnyel futtatható. A visszaadott értékeket a stat3.gettypename() függvénnyel lehet kiolvasni. Bővített ResultSet-ek forward-only/read-only forward-only/updatable scroll-sensitive/read-only scroll-sensitive/updatable scroll-insensitive/read-only scroll-insensitive/updatable Statament createstatement(int resultsettype,int resultsetconcurrency) PreparedStatement preparestatement (String sql,int resultsettype,int resultsetconcurrency) CallableStatement preparecall (String sql,int resultsettype,int resultsetconcurrency) resultsettype: TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE resultsetconcurrency: CONCUR_READ_ONLY, CONCUR_UPDATABLE Kurzorként viselkednek, minden metódusuk SQLExceptiont dob hiba esetén: void beforefirst() void afterlast() boolean first() boolean last() boolean absolute(int row)
boolean relative(int row) int getrow() boolean next() boolean previous() ResultSet frissítése Az rs.updatetypename(numof? fieldname,newvalue) függvény megváltoztatja a sor egy mezőjének tartalmát. A változtatás az rs.updaterow() függvénnyel hajtható végre, a rs.cancelrowupdates() függvénnyel vonható vissza. További függvények: void movetoinsertrow() a legutóbb beillesztett sorra állítja a kurzort insertrow() movetocurrentrow() deleterow() Készítette: Ecker Gábor Database Systems II. 2010/2011/1. félév