Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Database Application Development Chapter 6. 2 Overview  SQL in application code  Embedded SQL  Cursors  Dynamic SQL  JDBC  Stored procedures.

Similar presentations


Presentation on theme: "1 Database Application Development Chapter 6. 2 Overview  SQL in application code  Embedded SQL  Cursors  Dynamic SQL  JDBC  Stored procedures."— Presentation transcript:

1 1 Database Application Development Chapter 6

2 2 Overview  SQL in application code  Embedded SQL  Cursors  Dynamic SQL  JDBC  Stored procedures

3 3 SQL in Application Code  SQL commands can be called from within a host language (e.g., C++ or Java ) program.  SQL statements can refer to host variables (including special variables used to return status).  Must include statement to connect to right database.  Two main integration approaches:  Embed SQL in the host language (e.g., Pro*C, Embedded SQL, SQLJ)  Create special API (Call Level Interface) to call SQL commands (eg: JDBC, ODBC, PHP …)

4 4 SQL in Application Code (Contd.) Impedance mismatch issues:  Type mismatch Data type casting (declare variables)  Set-oriented SQL relations are (multi-) sets of records, with no a priori bound on the number of records. Usually no such data structure exists in procedural programming languages such as C++. SQL supports a mechanism called a cursor to handle this.

5 5 Embedded SQL

6 6  Approach: Embed SQL in host language.  Given host language with embedded SQL  A preprocessor converts SQL statements into special function calls.  Then regular compiler used to compile the host language+function class into executable.  Final executable works for one DBMS only (not portable)

7 7 Embedded SQL: Main Constructs  Connect to DB EXEC SQL CONNECT  Declare variables that can be used by both SQL and host language EXEC SQL BEGIN DECLARE SECTION … EXEC SQL END DECLARE SECTION  Executing SQL statements EXEC SQL …

8 8 Embedding SQL in C: Oracle #include EXEC SQL BEGIN DECLARE SECTION; VARCHAR userid[20]; VARCHAR passwd[20]; int value; EXEC SQL END DECLARE SECTION; void sql_error (char *msg) { printf (“%s”, msg); exit (1); }

9 9 Embedding SQL in C: Oracle int main () { strcpy (userid.arr, “me”); userid.len = strlen (userid.arr); strcpy (passwd.arr, “no-me”); passwd.len = strlen (passwd.arr); EXEC SQL WHENEVER SQLERROR DO sql_error (“Oracle Error\n”); EXEC SQL CONNECT :userid IDENTIFIED BY :passwd; EXEC SQL CREATE TABLE Test (a int); EXEC SQL INSERT INTO Test VALUES (1); EXEC SQL SELECT MAX (a) INTO :value from R; printf (“Max value=%d\n”,value); }

10 10 Embedded SQL: Variables  Two special “error” variables :  SQLCODE (long, is negative if an error has occurred)  SQLSTATE (char[6], predefined codes for errors)

11 11 Embedded SQL: Variables EXEC SQL BEGIN DECLARE SECTION char c_sname[20]; long c_sid; short c_rating; float c_age; EXEC SQL END DECLARE SECTION  Two special “error” variables :  SQLCODE (long, is negative if an error has occurred)  SQLSTATE (char[6], predefined codes for errors)

12 12 Cursors  Can declare a cursor on a relation or query statement (which generates a relation).  Can open a cursor, repeatedly fetch a tuple, move the cursor, until all tuples have been retrieved.  Control order: ORDER BY, in queries that are accessed through a cursor  Can also modify/delete tuple pointed to by cursor.  Must close cursor at end.

13 13 Cursor that gets names of sailors who’ve reserved a red boat, in alphabetical order EXEC SQL DECLARE sinfo CURSOR FOR SELECT S.sname FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ ORDER BY S.sname

14 14 Cursors EXEC SQL DECLARE myCursor CURSOR FOR SELECT bid from Reservations; EXEC SQL OPEN myCursor; EXEC SQL WHENEVER NOT FOUND DO break; while (1) { EXEC SQL FETCH myCursor INTO :num; … } EXEC SQL CLOSE myCursor;

15 15 Embedding SQL in C: An Example char SQLSTATE[6]; EXEC SQL BEGIN DECLARE SECTION char c_sname[20]; short c_minrating; float c_age; EXEC SQL END DECLARE SECTION c_minrating = random(); EXEC SQL DECLARE sinfo CURSOR FOR SELECT S.sname, S.ageFROM Sailors S WHERE S.rating > :c_minrating ORDER BY S.sname; do { EXEC SQL FETCH sinfo INTO :c_sname, :c_age; printf(“%s is %d years old\n”, c_sname, c_age); } while (SQLSTATE != ‘02000’); -- empty cursor EXEC SQL CLOSE sinfo;

16 16 Compiling  Create files with extension.pc, such as test.pc  Preprocessor = proc  Available at $ORACLE_HOME/bin  SET your library path as  setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${ORACLE_HOME}/lib  Make them as make -f $ORACLE_HOME/precomp/demo/proc/demo_proc.mk build EXE=test OBJS=test.o (or) $ORACLE_HOME/bin/proc iname=test.pc code=cpp parse=none g++ -I$ORACLE_HOME/precomp/public test.c -lclntsh -lm

17 17 Dynamic SQL  SQL queries are not always known at compile time  Example: spreadsheet, graphical DBMS frontend, web access.  Allow construction of SQL statements (query strings) on-the-fly

18 18 Dynamic SQL Example char c_sqlstring[] = {“DELETE FROM Sailors WHERE rating>5”}; -- parse, compile and bind to variable: EXEC SQL PREPARE readytogo FROM :c_sqlstring; EXEC SQL EXECUTE readytogo;

19 19 Embedding vs Database APIs 1. Embedding: Modify compiler (see discussion thus far) 2. API : Provide library with standard database call interface

20 20 Database APIs

21 21 Database APIs  Special standardized interface to essentially a libraries of functions provided explicitly for SQL statements:  No preprocessor, instead host language compiler compiles code.  Pass SQL strings from PL language  Presents result sets in language-friendly way  Examples : Sun’s JDBC: Java API MS ODBC – Open DB Connection  Supposedly DBMS-neutral  “driver” traps calls & translates them into DBMS-specific code  Database can be across a network  Same executable works on different DBMSs without recompiling  Independent both at source code and at executable level

22 22 JDBC Architecture: 4 Components  Application initiates and terminates connections, submits SQL statements  Driver manager load JDBC driver at run-time  Driver Registers with manager Connects to data source, transmits requests and returns/translates results and error codes into DBMS specific calls  Data source processes SQL statements

23 23 JDBC Architecture Four types of drivers: Bridge:  Translates SQL commands into non-native API. Example: JDBC-ODBC bridge. Code for ODBC and JDBC driver needs to be available on each client. Direct translation to native API, non-Java driver:  Translates SQL commands to native API of data source. Need OS-specific binary on each client. Network bridge:  Send commands over network to middleware server that talks to data source. Needs only small JDBC driver at each client. Direction translation to native API via Java driver:  Converts JDBC calls directly to network protocol used by DBMS. Needs DBMS-specific Java driver at each client.

24 24 JDBC Classes and Interfaces Steps to submit a database query:  Load JDBC driver  Connect to data source  Execute SQL statements

25 25 JDBC Driver Management  All drivers managed by DriverManager class  Options for Loading JDBC driver:  In Java code (dynamic loading of class in java): Class.forName(“oracle/jdbc.driver.Oracledriver”);  When starting Java application: -Djdbc.drivers=oracle/jdbc.driver

26 26 Connections in JDBC We interact with data source through sessions. Each connection identifies a logical session.  JDBC URL: jdbc: : Example: String url=“jdbc:oracle:www.bookstore.com:3083”; Connection con; try{ con = DriverManager.getConnection(url,usedId,password); } catch SQLException except { …}

27 27 Connection Class Interface  public int getTransactionIsolation() void setTransactionIsolation(int level) Sets isolation level for current connection.  public boolean getAutoCommit() and void setAutoCommit(boolean b) If autocommit is set, then each SQL statement is considered its own transaction. Otherwise, a transaction is committed using commit(), or aborted using rollback().  public boolean isClosed() Checks whether connection is still open.

28 28 Executing SQL Statements  Three ways of executing SQL statements:  Statement (static or dynamic SQL statements)  PreparedStatement (semi-static SQL statements)  CallableStatement (stored procedures)  PreparedStatement class: Precompiled & parameterized SQL statements:  Structure of query is fixed  Values of parameters are determined at run-time

29 29 Executing SQL Statements (Contd.) String sql=“INSERT INTO Sailors VALUES(?,?,?,?)”; PreparedStatment pstmt=con.prepareStatement(sql); pstmt.clearParameters(); pstmt.setInt(1,sid); pstmt.setString(2,sname); pstmt.setInt(3, rating); pstmt.setFloat(4,age); // since no rows are returned, use executeUpdate() int numRows = pstmt.executeUpdate(); Where numRows is # of rows modified.

30 30 ResultSets  PreparedStatement.executeUpdate only returns number of affected records  PreparedStatement.executeQuery returns data, encapsulated in a ResultSet object (a cursor) ResultSet rs=pstmt.executeQuery(sql); // rs is now a cursor While (rs.next()) { // process the data }

31 31 ResultSets A ResultSet is a very powerful cursor:  previous() : moves one row back  absolute(int num) : moves to the row with the specified number  relative (int num) : moves forward or backward  first() and last()

32 32 Matching Java and SQL Data Types getTimestamp()java.sql.TimeStampTIMESTAMP getTime()java.sql.TimeTIME getDate()java.sql.DateDATE getFloat()DoubleREAL getInt()IntegerINTEGER getDouble()DoubleFLOAT getDouble()DoubleDOUBLE getString()StringVARCHAR getString()StringCHAR getBoolean()BooleanBIT ResultSet get methodJava classSQL Type

33 33 JDBC: Exceptions and Warnings  Most of java.sql can throw an SQLException if an error occurs.  SQLWarning is a subclass of SQLException; not as severe (they are not thrown and their existence has to be explicitly tested)

34 34 Warning and Exceptions (Contd.) try { stmt=con.createStatement(); warning=con.getWarnings(); while(warning != null) { // handle SQLWarnings; warning = warning.getNextWarning(): } con.clearWarnings(); stmt.executeUpdate(queryString); warning = con.getWarnings(); … } //end try catch( SQLException SQLe) { // handle the exception }

35 35 Examining Database Metadata DatabaseMetaData object gives information about database system and catalog. DatabaseMetaData md = con.getMetaData(); // print information about the driver: System.out.println( “Name:” + md.getDriverName() + “version: ” + md.getDriverVersion());

36 36 Database Metadata (Contd.) DatabaseMetaData md=con.getMetaData(); ResultSet trs=md.getTables(null,null,null,null); String tableName; While(trs.next()) { tableName = trs.getString(“TABLE_NAME”); System.out.println(“Table: “ + tableName); //print all attributes ResultSet crs = md.getColumns(null,null,tableName, null); while (crs.next()) { System.out.println(crs.getString(“COLUMN_NAME” + “, “); }

37 37 A (Semi-)Complete Example Connection con = // connect DriverManager.getConnection ( url, ”login", ”pass“ ); Statement stmt = con.createStatement(); // set up stmt String query = "SELECT name, rating FROM Sailors"; ResultSet rs = stmt.executeQuery(query); try { // handle exceptions // loop through result tuples while (rs.next()) { String s = rs.getString(“name"); Int n = rs.getFloat(“rating"); System.out.println(s + " " + n); } } catch(SQLException ex) { System.out.println(ex.getMessage () + ex.getSQLState () + ex.getErrorCode ()); }

38 38 SQLJ : SQL-Java Complements JDBC with a (semi-) static query model: Compiler can perform syntax checks, strong type checks, consistency of the query with the schema  All arguments always bound to the same variable: #sql = { SELECT name, rating INTO :name, :rating FROM Books WHERE sid = :sid;}  Compare to JDBC: sid=rs.getInt(1); if (sid==1) {sname=rs.getString(2);} else { sname2=rs.getString(2);}  SQLJ (part of the SQL standard) versus embedded SQL (vendor-specific)

39 39 SQLJ Code String title, Float price, String author; // named iterator #sql iterator Books (String title, Float price); Books books; // assume that the application sets author #books = { SELECT title, price INTO :title, :price FROM Books WHERE author = :author }; // retrieve results while (books.next()) { System.out.println(books.title + “ “ + books.price)); } books.close();

40 40 SQLJ Iterators Two types of iterators (“cursors”):  Named iterator  Need both variable type and name, and then allows retrieval of columns by name.  See example on previous slide.  Positional iterator  Need only variable type, and then uses FETCH.. INTO construct: #sql iterator Books (String title, Float price); Books books; #books = … while (true) { #sql {FETCH :books INTO :title, :price} ; if (books.endFetch()) { break; } // process the book }

41 41 Stored Procedures

42 42 Stored Procedures  What is a stored procedure:  Program executed through single SQL statement  Executed in process space of the server  Advantages:  Can encapsulate application logic while staying “close” to the data  Reuse of application logic by different users  Avoid tuple-at-a-time return of records through cursors

43 43 SQL/PSM Declare a stored procedure: CREATE PROCEDURE name(p1, p2, …, pn) local variable declarations procedure code; Declare a function: CREATE FUNCTION name (p1, …, pn) RETURNS sqlDataType local variable declarations function code;

44 44 Stored Procedures: Examples CREATE PROCEDURE ShowNumReservations SELECT S.sid, S.sname, COUNT(*) FROM Sailors S, Reserves R WHERE S.sid = R.sid GROUP BY S.sid, S.sname

45 45 Stored Procedures: Examples Stored procedures can have parameters:  is one of {IN, OUT, INOUT} eg: IN val1 int CREATE PROCEDURE IncreaseRating( IN sailor_sid INTEGER, IN increase INTEGER) UPDATE Sailors SET rating = rating + increase WHERE sid = sailor_sid

46 46 Stored Procedures: Examples Stored procedure do not have to be in SQL: CREATE PROCEDURE TopSailors( IN num INTEGER) LANGUAGE JAVA EXTERNAL NAME “file:///c:/storedProcs/rank.jar”

47 47 Example: Procedure in PSM CREATE PROCEDURE testProcedure BEGIN INSERT INTO Student VALUES (5, ‘Joe’); END; Oracle PL/SQL: CREATE PROCEDURE testProcedure I S BEGIN INSERT INTO Student VALUES (5, ‘Joe’); END;. run;

48 48 Calling Stored Procedures EXEC SQL BEGIN DECLARE SECTION Int sid; Int rating; EXEC SQL END DECLARE SECTION // now increase the rating of this sailor EXEC CALL IncreaseRating(:sid,:rating); Embedded SQL:

49 49 Calling Stored Procedures JDBC: CallableStatement cstmt= con.prepareCall(“{call ShowSailors}); ResultSet rs = cstmt.executeQuery(); while (rs.next()) { … } SQLJ: #sql iterator ShowSailors(…); ShowSailors showsailors; #sql showsailors={CALL ShowSailors}; while (showsailors.next()) { … }

50 50 PL/SQL

51 51 Local Declarations CREATE PROCEDURE testProcedure (num IN int, name IN varchar) IS num1 int; -- local variable BEGIN num1 := 10; INSERT INTO Student VALUES (num1, name); END;

52 52 Other PL/SQL features Assignment statements: PL/SQL :=

53 53 Control Structures: IF THEN ELSE IF THEN ELSIF THEN ELSIF … ELSE END IF;

54 54 Loops LOOP END LOOP; To exit from a loop use EXIT;

55 55 Loops: Example CREATE PROCEDURE testProcedure (num IN int, name IN varchar) IS num1 int; BEGIN num1 := 10; LOOP INSERT INTO Student VALUES (num1, name); num1 := num1 + 1; IF (num1 > 15) THEN EXIT; END IF; END LOOP; END;

56 56 FOR Loops FOR i in [REVERSE].. LOOP END LOOP Example: FOR i in 1.. 5 LOOP INSERT INTO Student (sNumber) values (10 + i); END LOOP;

57 57 WHILE LOOPS WHILE LOOP END LOOP;

58 58 Functions CREATE FUNCTION [( )] RETURNS type AS BEGIN ; END; You can call a function as part of an SQL expression

59 59 Functions: Example CREATE FUNCTION testFunction RETURN int AS num1 int; BEGIN SELECT MAX (sNumber) INTO num1 FROM Student; RETURN num1; END; SELECT * from Student where sNumber = testFunction ();

60 60 PL/SQL Example CREATE FUNCTION rate Sailor (IN sailorId INTEGER) RETURNS INTEGER DECLARE rating INTEGER; DECLARE numRes INTEGER; SET numRes = (SELECT COUNT(*) FROM Reserves R WHERE R.sid = sailorId) IF (numRes > 10) THEN rating =1; ELSE rating = 0; END IF; RETURN rating;

61 61 Other Info Re Oracle :  Oracle stores procedures and functions in catalog as relational tables:  Check user_procedures  Check user_functions  You may run queries against them such as: describe user_procedures; select object_name from user_procedures;

62 62 Summary of PL/SQL Constructs  Local variables (DECLARE)  RETURN values for FUNCTION  Assign variables with SET  Branches and loops:  IF (condition) THEN statements; ELSEIF (condition) statements; … ELSE statements; END IF;  LOOP statements; END LOOP  Queries can be parts of expressions  Can use cursors naturally without “EXEC SQL”

63 63 Summary of Whirlwind Tour  Embedded SQL allows execution of parameterized static queries within host language  Dynamic SQL allows execution of completely ad-hoc queries within a host language  Cursor mechanism allows retrieval of one record at a time and bridges impedance mismatch between HL and SQL  APIs such as JDBC introduce a layer of abstraction between application and DBMS  SQLJ: Static model, queries checked at compile-time.  Stored procedures execute application logic directly at the server  SQL/PSM standard for writing stored procedures (and also for triggers)


Download ppt "1 Database Application Development Chapter 6. 2 Overview  SQL in application code  Embedded SQL  Cursors  Dynamic SQL  JDBC  Stored procedures."

Similar presentations


Ads by Google