
Administrivia • Exams should be returned by next week Database Application – Grades might be on-line by tomorrow Development • Homework 3 should be available next week R&G Chapter 6 – Due date will be adjusted accordingly Lecture 16 Overview: Review How to access DBMSs from programs • Last time: How DBMSs are used in Web Applications • Static approaches, i.e. SQL in application code – Internet basics: URIs, HTTP – Embedded SQL – Internet file formats: HTML, XML/DTD –SQLJ – Three-Tier Architectures: client, app server, database • Cursors, an important concept • client technologies: HTML, Javascript, Java, Style Sheets • Dynamic Approaches • app server tech: CGI, Servelets, JSPs, Cookies –ODBC •backend: DBMS –JDBC • Extending DBMSs • Today: How DBMSs are used from other programs – Stored procedures – Also, how DBMSs can be extended by other programs – External functions in Postgres Embedded SQL SQL in Application Code • Approach: Embed SQL in the host language. • SQL commands can be called from within a host – Preprocessor converts SQL statements into API calls. language (e.g., C++ or Java) program. – Then regular compiler compiles the code. – SQL statements can refer to host variables (including special variables used to return status). – Must include a statement to connect to the right database. • Many different versions for different vendors –Oracle Pro*C • Main integration approaches: – Sybase Embedded SQL – Embed SQL in the host language (Embedded SQL, SQLJ) – DB2 Embedded SQL (for COBOL) – General APIs to call SQL commands (ODBC, JDBC) – ecpg for Postgres (see Postgres programmer’s guide) – Product-specific APIs to access DBMS – And many many more... • (every vendor has one) Embedded SQL – In a nutshell Embedded SQL: Variables • In your program, put ‘EXEC SQL’ before special EXEC SQL BEGIN DECLARE SECTION database commands. char c_sname[20]; long c_sid; • A preprocessor changes them to regular C. short c_rating; • Example commands: float c_age; – Connecting to a database: EXEC SQL END DECLARE SECTION EXEC SQL CONNECT • Two special “error” variables: – Declaring variables: –SQLCODE (long, is negative if an error has occurred) EXEC SQL BEGIN (END) DECLARE SECTION –SQLSTATE (char[6], predefined codes for common errors) – Statements: EXEC SQL Statement; Embedding SQL in C: An Example Embedded SQL Example char SQLSTATE[6]; main() EXEC SQL BEGIN DECLARE SECTION { char c_sname[20]; short c_minrating; float c_age; EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION int OrderID; /* Employee ID (from user) */ int CustID; /* Retrieved customer ID */ c_minrating = random(); char SalesPerson[10] /* Retrieved salesperson name */ EXEC SQL DECLARE sinfo CURSOR FOR char Status[6] /* Retrieved order status */ SELECT S.sname, S.age FROM Sailors S EXEC SQL END DECLARE SECTION; /* Set up error processing */ WHERE S.rating > :c_minrating printf ("Enter order number: "); ORDER BY S.sname; scanf ("%d", &OrderID); /* Execute the SQL query */ do { EXEC SQL SELECT CustID, SalesPerson, Status FROM Orders WHERE EXEC SQL FETCH sinfo INTO :c_sname, :c_age; OrderID = :OrderID INTO :CustID, :SalesPerson, :Status; printf(“%s is %d years old\n”, c_sname, c_age); printf ("Customer number: %d\n", CustID); } while (SQLSTATE != ‘02000’); printf ("Salesperson: %s\n", SalesPerson); EXEC SQL CLOSE sinfo; printf ("Status: %s\n", Status); exit(); SQLJ – Another way to embed SQL SQLJ Code Int sid; String name; Int rating; SQLJ – Standard for embedding SQL in Java // named iterator #sql iterator Sailors(Int sid, String name, Int rating); Based on JDBC (more on this later) Sailors sailors; Complements JDBC with a (semi-)static query model: Compiler // assume that the application sets rating can perform syntax checks, strong type checks, consistency of #sailors = { the query with the schema SELECT sid, sname INTO :sid, :name – All arguments always bound to the same variable: FROM Sailors WHERE rating = :rating #sql = { }; SELECT name, rating INTO :name, :rating FROM Books WHERE sid = :sid }; // retrieve results while (sailors.next()) { SQLJ (part of the SQL standard) versus embedded SQL (vendor- System.out.println(sailors.sid + “ “ + specific) sailors.sname)); } sailors.close(); Cursors Impedance Mismatch • Can declare a cursor on a relation or query statement • SQL relations are (multi-) sets of records, with no a (which generates a relation). priori bound on the number of records. • Can open a cursor, and repeatedly fetch a tuple then • No such data structures exist in many languages such as C. move the cursor, until all tuples have been retrieved. – (Though C++ has STL, java has Multiset) – Can use ORDER BY clause in cursor queries to control the order in which tuples are returned. • Even for languages with Sets, may not want entire • Fields in ORDER BY clause must also appear in SELECT clause. query result in memory at one time! – The ORDER BY clause, which orders answer tuples, is only allowed in the context of a cursor. • SQL supports a mechanism called a cursor to handle this. • Can also modify/delete tuple pointed to by a cursor. Cursor that gets names of sailors who’ve reserved a red boat, in alphabetical order Static vs. Dynamic Approaches • Embedded SQL and SQLJ are Static – Text of queries is specified in program code EXEC SQL DECLARE sinfo CURSOR FOR SELECT S.sname • Database APIs also exist FROM Sailors S, Boats B, Reserves R – every DBMS provides a vendor-specific API WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ – standard APIs also exist: JDBC, ODBC ORDER BY S.sname • APIs more flexible, powerful, harder to use Database APIs: Alternative to embedding JDBC: Architecture Rather than modify compiler, add library with database calls (API) • Four architectural components: • Special standardized interface: procedures/objects • Pass SQL strings from language, presents result sets in a – Application (initiates and terminates connections, language-friendly way submits SQL statements) • Sun’s JDBC: Java API – Driver manager (load JDBC driver) • Supposedly DBMS-neutral – Driver (connects to data source, transmits requests – a “driver” traps the calls and translates them into DBMS-specific code and returns/translates results and error codes) – database can be across a network – Data source (processes SQL statements) – most databases provide ODBC or JDBC drivers JDBC Architecture (Contd.) Connections in JDBC Four types of drivers: Bridge: We interact with a data source through sessions. Each – Translates SQL commands into non-native API. connection identifies a logical session. Example: JDBC-ODBC bridge. Code for ODBC and JDBC • JDBC URL: driver needs to be available on each client. jdbc:<subprotocol>:<otherParameters> Direct translation to native API, non-Java driver: – Translates SQL commands to native API of data source. Example: Need OS-specific binary on each client. String url=“jdbc:oracle:www.bookstore.com:3083”; Network bridge: Connection con; – Send commands over the network to a middleware server try{ that talks to the data source. Needs only small JDBC driver con = DriverManager.getConnection(url,usedId,password); at each client. } catch SQLException excpt { …} 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. Connection Class Interface Executing SQL Statements • public int getTransactionIsolation() and void setTransactionIsolation(int level) • Three different ways of executing SQL statements: Sets isolation level for the current connection. – Statement (both static and dynamic SQL statements) (semi-static SQL statements) • public boolean getReadOnly() and – PreparedStatement void setReadOnly(boolean b) – CallableStatment (stored procedures) Specifies whether transactions in this connection are read- only • PreparedStatement class: • public boolean getAutoCommit() and Precompiled, parametrized SQL statements: void setAutoCommit(boolean b) If autocommit is set, then each SQL statement is considered – Structure is fixed its own transaction. Otherwise, a transaction is committed – Values of parameters are determined at run-time using commit(), or aborted using rollback(). • public boolean isClosed() Checks whether connection is still open. Executing SQL Statements (Contd.) ResultSets String sql=“INSERT INTO Sailors VALUES(?,?,?,?)”; PreparedStatment pstmt=con.prepareStatement(sql); • PreparedStatement.executeUpdate only returns the pstmt.clearParameters(); number of affected records pstmt.setInt(1,sid); • PreparedStatement.executeQuery returns data, pstmt.setString(2,sname); encapsulated in a ResultSet object (a cursor) pstmt.setInt(3, rating); pstmt.setFloat(4,age); ResultSet rs=pstmt.executeQuery(sql); // rs is now a cursor // we know that no rows are returned, thus we use While (rs.next()) { executeUpdate() // process the data int numRows = pstmt.executeUpdate(); } ResultSets (Contd.) Matching Java and SQL Data Types SQL Type Java class ResultSet get method A ResultSet is a very powerful cursor: BIT Boolean getBoolean() • previous(): moves one row back CHAR String getString() • absolute(int num): moves to the row with the VARCHAR String getString() specified number DOUBLE Double getDouble() • relative (int num): moves forward or backward FLOAT Double getDouble() • first() and last() INTEGER Integer getInt() REAL Double getFloat() DATE java.sql.Date getDate() TIME java.sql.Time getTime() TIMESTAMP java.sql.TimeStamp getTimestamp() Warning and Exceptions (Contd.) JDBC: Exceptions and Warnings try
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages8 Page
-
File Size-