Embedded SQL
E N D
Presentation Transcript
Embedded SQL Κεφ. 4.12
Γιατί χρειάζεται • Κάποιες ερωτήσεις χρειάζονται την πλήρη ισχύ μίας προγραμματιστικής γλώσσας. • Κάποιες φορές θέλουμε να κάνουμε και μη δηλωτικές εργασίες. • Υποστηρίζεται σε πολλές γλώσσες όπως C, Cobol, Pascal, Java, PL/I, και Fortran (και όχι μόνο).
Πώς γίνεται • Ένα embedded SQL πρόγραμμα πρέπει να περάσει από ειδικό preprocessor πριν μεταγλωττιστεί • Ο preprocessor αντικαθιστά τις εντολές της embedded SQL με κώδικα στη host γλώσσα • Το πρόγραμμα που παράγεται μεταγλωττίζεται με τον μεταγλωττιστή της host γλώσσας
Σύνταξη • Συνήθως : • EXEC SQL <embedded SQL statement > END-EXEC • Η ακριβής σύνταξη εξαρτάται από τη γλώσσα • C: • EXEC SQL …. ; • Java • #SQL { …. };
Παράδειγμα EXEC SQL declare c cursor for select customer-name, customer-city from depositor, customer, account where depositor.customer-name = customer.customer-name and account.account-number = depositor.account-number and account.balance > :amount END-EXEC
Παράδειγμα (συνέχεια) EXEC SQL open c END-EXEC EXEC SQL fetch c into :cn, :cc END-EXEC EXEC SQL close c END-EXEC (τα cn, cc έχουν οριστεί στο SQL INCLUDE τμήμα – το : χρησιμοποιείται για να ξεχωρίσουν από τις μεταβλητές της SQL) EXEC SQL < any valid update, insert, or delete> END-EXEC
Cursor • Ορίζεται με την declare cursor για κάθε select ερώτηση που χρειαζόμαστε. • Ανοίγει με την open. • Κάθε fetch επιστρέφει στις μεταβλητές της host γλώσσας τα στοιχεία μίας πλειάδας. • Άρα χρειάζομαι έναν βρόχο • Κλείνει με την close.
Cursor for update declare c cursor for select * from account where branch-name = ‘Perryridge‘ for update update account set balance = balance + 100 where current of c Αφού κάνω fetch
Dynamic SQL • Οι ερωτήσεις SQL δημιουργούνται κατά τον χρόνο εκτέλεσης του προγράμματος. • Οι ερωτήσεις δημιουργούνται ως string κατά τον χρόνο εκτέλεσης – ίσως χρησιμοποιώντας και είσοδο από τον χρήστη. • prepare & execute
Παράδειγμα char * sqlprog = ”update account set balance = balance ∗1.05 where account-number = ?” EXEC SQL preparedynprogfrom :sqlprog; char account[10] = ”A-101”; EXEC SQL executedynprogusing :account;
ODBC Open DataBase Connectivity • Connection to server • ODBC defines HENV (environment), HDBC (database connection), RETCODE (return code) • SQLAllocEnv • SQLAllocConnect • SQLConnect (several parameters) • Send commands • SQLAllocStmt • SQLExecDirect • SQLBindCol • SQLFetch • SQLFreeStmt • Disconnect • SQLDisconnect • SQLFreeConnect • SQLFreeEnv
JDBC Java DataBase Connectivity • Class.forName loads appropriate drivers • DriverManager.getConnection(…); Connection • Class Connection • createStatement(); Statement • close(); • Class Statement • executeUpdate(); • executeQuery(); ResultSet • close(); • Class ResultSet • next(); • SQLException
JDBCPrepared PreparedStatementpStmt = conn.prepareStatement( ”insert into account values(?,?,?)”); pStmt.setString(1, ”A-9732”); pStmt.setString(2, ”Perryridge”); pStmt.setInt(3, 1200); pStmt.executeUpdate(); pStmt.setString(1, ”A-9733”); pStmt.executeUpdate();
MySQL • Γενικά για συνδέσεις με γλώσσες προγραμματισμού • https://dev.mysql.com/doc/refman/5.5/en/connectors-apis.html • Ειδικά • C https://dev.mysql.com/doc/connector-c/en/ • Java https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-basic.html • Python https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html