Download presentation
Presentation is loading. Please wait.
1
Matthew P. Johnson, OCL2, CISDD CUNY, January 20051 OCL2 Oracle 10g: SQL & PL/SQL Session #6 Matthew P. Johnson CISDD, CUNY Fall, 2004
2
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 2 Agenda Last time: Views, Constraints This time: Begin programming for SQL Embedded SQL Pro*C, SQLJ CLI SQL/CLI in C JDBC in Java DBI/DBDs in Perl PSMs Future: PL/SQL, Triggers
3
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 3 Today’s agenda 1. Go through Join exercises 2. Discuss Pro*C 3. First part of lab 4. Break 5. Discuss CLI, Embedded SQL, JDBC 6. Second part of lab
4
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 4 New topic: SQL Programming Can write SQL queries in a SQL interpreter Command prompt SQL*Plus (sqlplus) in Oracle mysql in MySQL Good for experimenting, not for anything non-trivial Better: use a standard programming language Host language talks to SQL/DB
5
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 5 Using two languages Q: Why not use just one language? “[W]e can quickly dispense with the idea…” (Ullman, p351) Q: Why not do everything in the host lang.? A: What Oracle provides is highly non-trivial Query interpretation, optimizing Queries stay constant across host languages Q: Why not do everything in SQL? A: Not designed as a general-purpose language No recursion (no factorial!), not Turing-complete No, e.g., Swing library Germ of OO: modularize
6
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 6 Impedance mismatch problem Big problem, though: impedance mismatch Data structures in our app-programming lang. don’t automatically map onto those in SQL Different types/representations for data In SQL: tables with scalar fields In C: scalars, records (containing records…), pointers, arrays In Java: scalars, objects, references, arrays In Perl: scalars, lists/arrays, hashes/assoc.
7
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 7 SQL/host interface in embedded SQL So Q: how to transfer data between? A: Shared variables Some vars in the program can be used by SQL Prefix var with a : After query, look here for received data SQL commands embedded in app. code Identified by EXEC SQL Source code is preprocessed before regular compilation Result is (e.g.) a C program with library calls
8
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 8 Programs with Embedded SQL Host language + Embedded SQL Preprocessor Host Language + function calls Host language compiler Executable Preprocessor Host language compiler Oracle’s Pro*C gcc prog.pc prog.c a.out
9
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 9 Interface: SQL / Host Language Values get passed through shared variables. Colons precede shared variables in SQL statements EXEC SQL demarcates every SQL statement The variable SQLSTATE provides error messages and status reports “00000” ~ success “02000” ~ tuple not found Used in loops EXEC SQL BEGIN DECLARE SECTION; char productName[30]; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQL BEGIN DECLARE SECTION; char productName[30]; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION;
10
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 10 Embedded SQL example Context: Product (pname, price, quantity, maker) Purchase (buyer, seller, store, pname) Company (cname, city) Person(name, phone, city) Goal 1: Insert a new row in Purchase Goal 2: Look up price of product by name
11
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 11 Embedded SQL example: insert void simpleInsert() { EXEC SQL BEGIN DECLARE SECTION; char pn[20], cn[30]; /* product-name, company-name */ double p, int q; /* price, quantity */ char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; /* get values for name, price and company somehow */ EXEC SQL INSERT INTO Product(pname, price, quantity, maker) VALUES (:pn, :p, :q, :cn); } void simpleInsert() { EXEC SQL BEGIN DECLARE SECTION; char pn[20], cn[30]; /* product-name, company-name */ double p, int q; /* price, quantity */ char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; /* get values for name, price and company somehow */ EXEC SQL INSERT INTO Product(pname, price, quantity, maker) VALUES (:pn, :p, :q, :cn); }
12
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 12 Embedded SQL example: look-up int getWindowsPrice() { EXEC SQL BEGIN DECLARE SECTION; double p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = ‘Windows’; return p; } int getWindowsPrice() { EXEC SQL BEGIN DECLARE SECTION; double p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = ‘Windows’; return p; }
13
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 13 Embedded SQL example: look-up What about search for arbitrary product? Q: Will this work? int getPrice(char *name) { EXEC SQL BEGIN DECLARE SECTION; int p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = :name; return p; } int getPrice(char *name) { EXEC SQL BEGIN DECLARE SECTION; int p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = :name; return p; }
14
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 14 Embedded SQL example: look-up int getPrice(char *name) { EXEC SQL BEGIN DECLARE SECTION; char n[20]; int p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; strcpy(n, name); /* copy name to local var */ EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = :n; return p; } int getPrice(char *name) { EXEC SQL BEGIN DECLARE SECTION; char n[20]; int p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; strcpy(n, name); /* copy name to local var */ EXEC SQLSELECT price INTO :p FROM Product WHERE Product.name = :n; return p; }
15
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 15 Cursors For product’s price, looked up single (scalar) value Q: What if we SELECT multiple fields? E.g., find all info for some product A: Just list destination vars separated by commas Q: What if find multiple rows? E.g., find all products above a certain price Use a cursor to step through the results Each result placed in an array Using cursors: 1. Declare the cursor 2. Open the cursor 3. Fetch tuples one by one 4. Close the cursor
16
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 16 Cursor loop structure Each time around loop, we Do a FETCH to obtain next row Examine SQLSTATE to check success Can say: What is NO_MORE_TUPLES? #define NO_MORE_TUPLES !(strcmp(SQLSTATE,”02000”)) if(NO_MORE_TUPLES) break;
17
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 17 Multiple-row look-up example void productToXML() { EXEC SQL BEGIN DECLARE SECTION; char pn[20], cn[30]; double p; int q; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE crs CURSOR FOR SELECT pname, price, quantity, maker FROM Product; EXEC SQL OPEN crs;... void productToXML() { EXEC SQL BEGIN DECLARE SECTION; char pn[20], cn[30]; double p; int q; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE crs CURSOR FOR SELECT pname, price, quantity, maker FROM Product; EXEC SQL OPEN crs;...
18
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 18 Multiple look-up example printf(“ \n”); while (1) { EXEC SQL FETCH FROM crs INTO :n, :p, :q,:c; if (NO_MORE_TUPLES) break; printf(“ \n”); printf(“ %s \n”, n); printf(“ %d \n”, p); printf(“ %d \n”, q); printf(“ %s \n”, c); printf(“ \n”); } EXEC SQL CLOSE crs; printf(“ \n”); } printf(“ \n”); while (1) { EXEC SQL FETCH FROM crs INTO :n, :p, :q,:c; if (NO_MORE_TUPLES) break; printf(“ \n”); printf(“ %s \n”, n); printf(“ %d \n”, p); printf(“ %d \n”, q); printf(“ %s \n”, c); printf(“ \n”); } EXEC SQL CLOSE crs; printf(“ \n”); }
19
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 19 More on Cursors Cursors can traverse both stored tables and queries Cursors can modify a relation as well as read it Cursors can be protected against changes to the underlying relations Can determine the order in which the cursor will get tuples by the ORDER BY keyword in the SQL query The cursor can be a scrolling one: can go forward, backward +n, -n, Abs(n), Abs(-n)
20
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 20 Cursor on query not table EXEC SQL DECLARE c CURSOR FOR SELECT beer, price FROM Sells WHERE bar = ‘Izzy''s'; EXEC SQL OPEN CURSOR c; while(1) { EXEC SQL FETCH c INTO :theBeer, :thePrice; if (NOT FOUND) break; /* format and print beer and price */ } EXEC SQL CLOSE CURSOR c; EXEC SQL DECLARE c CURSOR FOR SELECT beer, price FROM Sells WHERE bar = ‘Izzy''s'; EXEC SQL OPEN CURSOR c; while(1) { EXEC SQL FETCH c INTO :theBeer, :thePrice; if (NOT FOUND) break; /* format and print beer and price */ } EXEC SQL CLOSE CURSOR c;
21
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 21 Modifications with cursors As we traverse through result set, can modify the current row Can also modify with arb. WHERE clauses NB: In regular SQL, usually modify sets of rows (UPDATE WHERE …) With cursors, we update the last row fetched Simple example: in RentStab table, we decide we want to raise (e.g., by 5%) all our prices Unless price > 2000, in which case they’re deleted
22
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 22 Modification by cursor example void raisePrices() { EXEC SQL BEGIN DECLARE SECTION; double p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE crs CURSOR FOR SELECT price FROM RentStab; EXEC SQL OPEN crs;... void raisePrices() { EXEC SQL BEGIN DECLARE SECTION; double p; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE crs CURSOR FOR SELECT price FROM RentStab; EXEC SQL OPEN crs;...
23
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 23 Modification by cursor example while (1) { EXEC SQL FETCH FROM crs INTO :p; if (NO_MORE_TUPLES) break; if (p < 2000) EXEC SQL UPDATE RentStab SET price = 1.05*price; WHERE CURRENT OF RentStab; else EXEC SQL DELETE FROM RentStab WHERE CURRENT OF RentStab; } EXECT SQL CLOSE crs; } while (1) { EXEC SQL FETCH FROM crs INTO :p; if (NO_MORE_TUPLES) break; if (p < 2000) EXEC SQL UPDATE RentStab SET price = 1.05*price; WHERE CURRENT OF RentStab; else EXEC SQL DELETE FROM RentStab WHERE CURRENT OF RentStab; } EXECT SQL CLOSE crs; }
24
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 24 A mention of concurrent access What if the DB changes while our cursor is looping? I.e., after we opened the cursor, but while we’re fetching Should we see the changes? Maybe, maybe not make these changes invisible by declaring insensitive Q: How can this be implemented? One crude way: delay any changes until all open insensitive cursors close Good idea: indicate read-only cursors so they won’t be held up: EXEC SQL DECLARE crs INSENSITIVE CURSOR FOR SELECT price FROM Product; EXEC SQL DECLARE crs INSENSITIVE CURSOR FOR SELECT price FROM Product; EXEC SQL DECLARE crs CURSOR FOR SELECT price FROM Product; FOR READ ONLY; EXEC SQL DECLARE crs CURSOR FOR SELECT price FROM Product; FOR READ ONLY;
25
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 25 Scrolling cursors Usually cursor just walks through rows 1 by 1 Other options: NEXT (default) or PREVIOUS FIRST or LAST RELATIVE +/-n RELATIVE 1 ~ NEXT RELATIVE –1 ~ ? ABSOLUTE +/-n ABSOLUTE 1 ~ FIRST (not 0!) ABSOLUTE –1 ~ LAST To use these, declare as SCROLL cursor EXEC SQL DECLARE crs SCROLL CURSOR FOR Product; EXEC SQL DECLARE crs SCROLL CURSOR FOR Product;
26
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 26 Pro*C e.g. Example script: sample1.pc See Pro*C tutorialPro*C tutorial Pro*C compiler is proc Must include /oracle/precomp/public Must link with shared library /oracle/lib/libclntsh.so Includes makefile proc.mk, but may require modifications sales% cp /oracle/precomp/demo/proc/sample1.pc. sales% proc sample1.pc sales% gcc -osample1 -I/oracle/precomp/public /oracle/lib/libclntsh.so sample1.c sales% sample1 sales% cp /oracle/precomp/demo/proc/sample1.pc. sales% proc sample1.pc sales% gcc -osample1 -I/oracle/precomp/public /oracle/lib/libclntsh.so sample1.c sales% sample1
27
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 27 Interface: SQL/Host Language Two languages: SQL, host (C/Java/whatever) Benefits: DB code (SQL is portable) SQL, host language focus on own strengths SQL code placed in host language code SQL and host language have diff. data types “impedance mismatch” Data transferred with “shared variables” Use cursors to access/modify data Error messages placed in SQLSTATE
28
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 28 Agenda Previously: Pro*C Next: Project part 3 is due next week More programming for SQL Embedded SQL Pro*C, SQLJ CLI SQL/CLI in C JDBC in Java DBI/DBDs in Perl PHP (HTML?) SPs
29
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 29 Recap: Embedded SQL Host language + Embedded SQL Preprocessor Host Language + function calls Host language compiler Executable Preprocessor Host language compiler Oracle’s Pro*C gcc prog.pc prog.c a.out
30
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 30 Limitation of embedded SQL Okay for apps with a fixed set of queries/updates Maybe very simple kiosks But consider, say, sqlplus or the sqlzoo website Processes arbitrary queries from user Can we do this with embedded SQL?
31
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 31 Dynamic SQL In dynamic SQL, query string can be taken as a parameter, passed to DB Two steps: Prepare: compiles/optimizes the string Execute: executes the query Combine together: EXECUTE IMMEDIATE But separate if query is executed many times (why?)
32
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 32 Dynamic SQL myquery = a SQL variable not prefixed by : void runQuery() { EXEC SQL BEGIN DECLARE SECTION; char *command; EXEC SQL END DECLARE SECTION; /* command set to some query string */ EXEC SQL PREPARE myquery FROM :command; EXEC SQL EXECUTE myquery; /* or just: */ EXEC SQL EXECUTE IMMEDIATE :command; } void runQuery() { EXEC SQL BEGIN DECLARE SECTION; char *command; EXEC SQL END DECLARE SECTION; /* command set to some query string */ EXEC SQL PREPARE myquery FROM :command; EXEC SQL EXECUTE myquery; /* or just: */ EXEC SQL EXECUTE IMMEDIATE :command; }
33
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 33 Dynamic SQL example Example script: sample8.pc See Pro*C tutorialPro*C tutorial Goal: find employees from department 10 Start with query as string sales% proc sample8.pc sales% gcc -I/oracle/precomp/public /oracle/lib/libclntsh.so –osample8 sample8.c sales% sample8 sales% proc sample8.pc sales% gcc -I/oracle/precomp/public /oracle/lib/libclntsh.so –osample8 sample8.c sales% sample8
34
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 34 Sketch of sqlplus Something like the sqlplus program could be written as a simple dynamic SQL future lab idea? EXEC SQL BEGIN DECLARE SECTION; char query[MAX QUERY LENGTH]; EXEC SQL END DECLARE SECTION; /* issue SQL> prompt */ /* read user's text into array query */ EXEC SQL EXECUTE IMMEDIATE :query; /* go back to reissue prompt */ EXEC SQL BEGIN DECLARE SECTION; char query[MAX QUERY LENGTH]; EXEC SQL END DECLARE SECTION; /* issue SQL> prompt */ /* read user's text into array query */ EXEC SQL EXECUTE IMMEDIATE :query; /* go back to reissue prompt */
35
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 35 Dynamic SQL example 2 Example script: sample10.pc See Pro*C tutorialPro*C tutorial Goal: recreate sqlplus Copy-able commands: http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec18/proc.txt sales% proc sample10.pc sales% gcc -I/oracle/precomp/public /oracle/lib/libclntsh.so –osample10 sample10.c sales% sample10 sales% proc sample10.pc sales% gcc -I/oracle/precomp/public /oracle/lib/libclntsh.so –osample10 sample10.c sales% sample10
36
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 36 Next topic: SQL/CLI Pro*C converts EXEC SQL code --into what? If we know the API (“Call-Level Interface”), can call library routines by hand Is this better or worse? Pros & cons Won’t cover in depth
37
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 37 CLI: Java Host language + Embedded SQL Preprocessor Host Language + function calls Host language compiler Executable Preprocessor Host language compiler Oracle’s Pro*C javac + jar prog.pc Prog.java Proj.class
38
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 38 CLI - Overview Similar to what really happens in embedded SQL implementations. Major approaches: SQL/CLI - standard of ODBC JDBC - Java database connectivity See http://cbbrowne.com/info/middleware.html for many optionshttp://cbbrowne.com/info/middleware.html Advantages over embedded SQL: Avoid preprocessor-stage, easier to debug In th., use same program with several DBMS Disadvantages: Must keep up to date with API changes DBMS may have conflicting APIs
39
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 39 Next topic: JDBC (Java’s CLI) As expected: Java too can talk to SQL In some ways: much nicer JDBC is an interface Changes very little Each vendor writes own plug-in Dev. Strategy: write to API, compile with jar See http://servlet.java.sun.com/products/jdbc/drivers for 219 (!) JDBC drivershttp://servlet.java.sun.com/products/jdbc/drivers
40
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 40 JDBC 1. Load JDBC driver for DBMS: 2. Obtain a connection: Class.forName("oracle.jdbc.driver.OracleDriver") Connection con = DriverManager.getConnection( “jdbc:oracle:thin:@l5.nyu.edu:1521:STN1", username, passwd); Connection con = DriverManager.getConnection( “jdbc:oracle:thin:@l5.nyu.edu:1521:STN1", username, passwd);
41
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 41 JDBC 3. Obtain a statement object: 4. Run a query: Or an update: Statement stmt = con.createStatement(); stmt.executeQuery(“SELECT * FROM table”); stmt.executeUpdate(“INSERT INTO tables” + “VALUES(‘abc’, ‘def’)”); stmt.executeUpdate(“INSERT INTO tables” + “VALUES(‘abc’, ‘def’)”);
42
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 42 Prepared Statements in JDBC JDBC also supports prepared statements 3. Obtain a PreparedStatement object: 4. Now execute: PreparedStatement ps = con.createStatement( “SELECT * FROM table”); PreparedStatement ps = con.createStatement( “SELECT * FROM table”); ps.executeQuery();
43
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 43 Obtaining query results “Cursor” not used, but same idea executeQuery() returns a ResultSet: rs.next() advances to new row, returns false if EOF getInt(i) returns ith column (if an int!) from current row ResultSet rs = ps.executeQuery(); while (rs.next()) { String val1 = rs.getString(1); int val2 = rs.getInt(2); … } while (rs.next()) { String val1 = rs.getString(1); int val2 = rs.getInt(2); … }
44
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 44 Java/JDBC/Oracle example Example program: SQLRunner.java Goal: run the SQL query passed Copy-able commands: http://pages.stern.nyu.edu/~mjohnson/oracle/sqlruni nstr.txt C:\proc>c:\j2sdk1.4.2_04\bin\javac SQLRunner.java C:\proc>c:\j2sdk1.4.2_04\bin\java -cp.;C:\OraHome_1\jdbc\lib\ojdbc14.jar SQLRunner "select * from emp" C:\proc>c:\j2sdk1.4.2_04\bin\javac SQLRunner.java C:\proc>c:\j2sdk1.4.2_04\bin\java -cp.;C:\OraHome_1\jdbc\lib\ojdbc14.jar SQLRunner "select * from emp"
45
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 45 Java/JDBC/MySQL example Example program: MySQLRunner.java Goal: run the SQL query passed (Nearly) the same as before! just using different DB/tables/login mysql.jar is the MySQL J/Connector jar C:\proc>c:\j2sdk1.4.2_04\bin\javac MySQLRunner.java C:\proc>c:\j2sdk1.4.2_04\bin\java –cp.;mysql.jar MySQLRunner "select * from emp" C:\proc>c:\j2sdk1.4.2_04\bin\javac MySQLRunner.java C:\proc>c:\j2sdk1.4.2_04\bin\java –cp.;mysql.jar MySQLRunner "select * from emp"
46
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 46 Recap: JDBC Host language + Embedded SQL Preprocessor Host Language + function calls Host language compiler Executable Preprocessor Host language compiler Oracle’s Pro*C javac + jar prog.pc Prog.java Proj.class
47
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 47 Java & parameter-based SQL Like SQL/CLI in C, Java also supports parameterized queries (why?) 1. Prepare structure of query 2. Then can set values PreparedStatement ps = conn.prepareStatement( "SELECT * FROM table WHERE f1 = ? and f2 = ?"); ps.setString(1 “abc"); ps.setString(2, “def"); ResultSet rs = ps.executeQuery();... PreparedStatement ps = conn.prepareStatement( "SELECT * FROM table WHERE f1 = ? and f2 = ?"); ps.setString(1 “abc"); ps.setString(2, “def"); ResultSet rs = ps.executeQuery();...
48
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 48 Also: ODBC Used by Microsoft platforms/tools, others Access: Start | Control Panel | Administrative Tools | Data Sources (ODBC) Similar to JDBC Won’t cover
49
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 49 Other combinations So far: C/Pro*C, Java/JDBC Q: Only choices? A: No “Call-level interface” for C: SQL/CLI ODBC Embedded Java: SQL/J CLI for Perl, PHP, etc. Stored Procedures (next) {langs} x {dyn/not} x {SPs/not} x {DBMSs}
50
Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 50 Step back Recall basic problem: need SQL plus stronger programming lang need to connect the two langs In all these cases (and in the web app case), idea is: put SQL in (traditional-lang) programs Another way: put programs in SQL i.e., store programs on the DBMS “stored procedures”
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.