140 likes | 161 Views
Embedded SQL. Κεφ. 4.12. Γιατί χρειάζεται. Κάποιες ερωτήσεις χρειάζονται την πλήρη ισχύ μίας προγραμματιστικής γλώσσας. Κάποιες φορές θέλουμε να κάνουμε και μη δηλωτικές εργασίες. Υποστηρίζεται σε πολλές γλώσσες όπως C, Cobol, Pascal, Java, PL/I, και Fortran (και όχι μόνο). Πώς γίνεται.
E N D
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