六 嵌入式SQL(SQLJ)
将SQL语句嵌入应用程序时,必须按以下步骤预编译应用程序并将其与数据库联编:
1.创建源文件,以包含带嵌入式 SQL 语句的程序
格式: # SQL{ SQL语句 } 。
2.连接数据库,然后预编译每个源文件。
语法: SQLJ 源文件名
例:
import java.sql.*; import sqlj.runtime.*; import sqlj.runtime.ref.*;#sql iterator App_Cursor1 (String empno, String firstnme) ; #sql iterator App_Cursor2 (String) ; class App { static { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String argv[]) { try { App_Cursor1 cursor1; App_Cursor1 cursor2; String str1 = null; String str2 = null; int count1; Connection con = null; String url = "jdbc:odbc:tese2"; DefaultContext ctx = DefaultContext.getDefaultContext(); if (ctx == null) { try { if (argv.length == 0) { String userid ="tdl"; String passwd ="user"; con = DriverManager.getConnection(url, userid, passwd); } else if (argv.length == 2) { // connect with default id/password con = DriverManager.getConnection(url); } else { System.out.println("\nUsage: java App [username password]\n"); System.exit(0); } con.setAutoCommit(false); ctx = new DefaultContext(con); } catch (SQLException e) { System.out.println("Error: could not get a default context"); System.err.println(e) ; System.exit(1); } DefaultContext.setDefaultContext(ctx); } #sql cursor1 = { SELECT empno, firstnme from db2admin. employee }; System.out.println("Received results:"); while (cursor1.next()) { str1 = cursor1.empno(); str2 = cursor1.firstnme(); System.out.print (" empno= " + str1); System.out.print (" firstname= " + str2); System.out.print ("\n"); } cursor1.close(); #sql cursor2 = { SELECT firstnme from db2admin. employee where empno = :str1 }; System.out.println("Received results:"); while (true) { #sql { FETCH :cursor2 INTO :str2 }; if (cursor2.endFetch()) break; System.out.print (" empno= " + str1); System.out.print (" firstname= " + str2); System.out.print ("\n"); } cursor2.close(); // rollback the update System.out.println("\n\nRollback the update..."); #sql { ROLLBACK work }; System.out.println("Rollback done."); } catch( Exception e ) { e.printStackTrace(); } } } |
注:本程序采用JDBCODBC桥的方式访问数据库,必须配置ODBC数据源。
七 触发器
建一个触发器,应包含以下部分:
触发器名字
触发器触发事件: insert,delete,update
激活时间: before,after
粒度: for each statement,for each row
过渡变量:
old row:表示触发事件之前被修改的值:
new row表示触发事件之后被修改的值
old table表示触发事件之前全部被修改行的一个只读假想表
new table表示触发事件之后全部被修改行的一个假想表
触发条件: 由WHEN开始,可包含一个或多个谓词,可包含过渡变量和子查询
触发体: 由一个或多个SQL语句组成
例:
CREATE TRIGGER REORDER AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS REFERENCING NEW AS N_ROW FOR EACH ROW MODE DB2SQL WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED AND N_ROW.ORDER_PENDING = ''N'') BEGIN ATOMIC VALUES(ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED - N_ROW.ON_HAND, N_ROW.PARTNO)); UPDATE PARTS SET PARTS.ORDER_PENDING = ''Y'' WHERE PARTS.PARTNO = N_ROW.PARTNO; END |
八 存储过程
存储过程主要通过”Stored Procedure Builder”来建立,
(一)对存储过程的调用分三部分:
1.连接(与数据库建立连接)
Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance();
Connection con=DriverManager.getConnection(url,user,password);
2。注册输出参数
cs.registerOutParameter (3, Types.INTEGER);
3。调用存储过程:
CallableStatement cs=con.prepareCall("{call store_name(参数,参数,参数)}");
(二)调用举例:
import java.net.URL; import java.sql.*; class test2 { public static void main(String args[]) { String url = "jdbc:db2://wellhope/sample"; String user="db2admin"; String password="db2admin"; try { Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance(); //与数据库建立连接 Connection con=DriverManager.getConnection(url,user,password); checkForWarning(con.getWarnings()); DatabaseMetaData dma=con.getMetaData(); String str="This is a string"; //int hashcode=str.hashCode(); //System.out.println("Hashcode "+hashcode); //创建Statement对象,用于执行SQL语句 Statement stmt=con.createStatement(); //创建CallableStatement对象,用于执行存储过程 CallableStatement cs=con.prepareCall("{call PRO_YHDL1(?,?,?)}"); //注册输出参数 cs.registerOutParameter (3, Types.INTEGER); int result = 0; cs.setString(1,"123"); cs.setString(2,"123"); cs.execute(); result = cs.getInt (3); dispResultSet(result); cs.close(); con.close(); } catch(SQLException ex) { System.out.println("\n * * * SQLException caught * * * \n"); while(ex!=null) { System.out.println("SQLState: "+ex.getSQLState()); System.out.println("Message: "+ex.getMessage()); System.out.println("Vendor: "+ex.getErrorCode()); ex=ex.getNextException(); System.out.println(""); } } catch(java.lang.Exception ex) { ex.printStackTrace(); } } |
(三)存储过程举例:
Pro_yhdl1是一个存储过程,它的功能是从数据库表YHDL中取出PWD:
import java.sql.*; public class Pro_yhdl1 { public static void pro_yhdl1 ( String m_id, String m_pwd, int[] result ) throws SQLException, Exception { // Get connection to the database Connection con = DriverManager.getConnection("jdbc: default:connection"); PreparedStatement stmt = null; ResultSet rs = null; String sql; String m_password=""; sql = "SELECT" + " DB2ADMIN.YHDL.PWD" + " FROM" + " DB2ADMIN.YHDL" + " WHERE" + " (" + " ( " + " DB2ADMIN.YHDL.ID = ''"+m_id.trim()+"''" + " )" + " )"; stmt = con.prepareStatement( sql ); rs = stmt.executeQuery(); // Access query results while (rs.next()) { m_password=rs.getString(1); m_password=m_password.trim(); if (rs.wasNull()) System.out.print("NULL"); else System.out.print(m_password); } if(m_password.equals(m_pwd.trim())) { result[0] =1; } else { result[0] =0; } // close open resources if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); // set return parameter //result[0] = result[0]; } } |
九 JAVA数据库链接(JDBC)
DB2 的 Java 支持包括 JDBC,一个以供应商为中心的动态 SQL 接口,它通过标准的 Java方法提供对应用程序的数据存取。JDBC 与 DB2 CLI 相似之处在于您不必预编译或联编 JDBC 程序。使用 JDBC 编写的应用程序只使用动态 SQL。
JDBC编程步骤:
1建立与数据库的连接:
Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
connection con=DriverManager.getConnection(url);
2.创建Statement对象:
Statement stmt=con.createStatement();
3执行查询语句:
ResultSet rs=stmt.execQuery("SQL语句");
4.获取和设置选项:
ResultSetMetaData rsmd=rs.getMetaData();
int numCols=rsmd.getColumnCount()获取结果集总列数;
rsmd.getColumnLabel(i))获取记录值;
setMaxRows :设置结果集能容纳的最多行数.
setQueryTimeout:设置一个语句执行等待的时间.
setEscapeProcessing:通知驱动程序如何处理转义字符.
5.关闭Statement
stmt.clost();
十 调用层接口(CLI)
CLI不是一种新的查询语言,它只不过是应用程序可利用SQL语句去提交事务处理的一种简单接口,对数据库的查询和修改,仍要使用SQL语言编写,包括CLI函数的调用。
调用层接口(CLI)为DB2所提供的处理动态SQL语句的两种机制之一,即在应用程序首次运行时,动态SQL语句提交给数据库系统,CLI依赖一组函数调用,可嵌入主语言中。