Statement PreparedStatement CallableStatement PreparedStatement对象允许在SQL语句中为变量嵌入占位符,与SQLJ中使用宿主变量类似,但是它没有直接在SQL语句中指定JAVA宿主变量,而是用问号(?)表示每个变量,然后通过索引调用设置方法来设置每个变量的数值,这称为参数化SQL语句. PreparedStatement对象只能用来执行惟一一条SQL语句 Statement比较简单,效率较高,但是参数所书写过于繁索. CallableStatement与PreparedStatement相似,只是它只用在调用函数和存储过程. Oracle有两种语法实现CallableStatement有两种实现方法:PL/SQL块语法和标准的SQL-92语法.其中的SQL-92语法里的call只能是小写的! import java.sql.*; import oracle.jdbc.driver.*; public class BB { private static Connection conn; public BB() { } public static void main(String[] args){ Statement stmt; ResultSet rst; PreparedStatement pstmt,pstmt1; CallableStatement cstmt,cstmt1,cstmt2,cstmt3; /* new oracle.jdbc.OracleDriver(); jdbc:oracle:thin:@hostname:port:database */ try{ DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); conn = DriverManager.getConnection("jdbc:oracle:thin:@ruang:1521:orcl","xling","fp51gfa"); stmt = conn.createStatement(); rst = stmt.executeQuery("SELECT COUNT(*) FROM XLING_APP_GUID"); if(rst.next()) System.out.println(rst.getInt(1)); rst.close(); pstmt = conn.prepareStatement("UPDATE XLING_USER SET ID = ? WHERE ID = ?"); pstmt.setString(1,"xling"); pstmt.setString(2,"AAA"); pstmt.executeUpdate(); stmt.execute("DELETE FROM XLING_USER WHERE ID = 'fairy'"); pstmt1 = conn.prepareStatement("INSERT INTO XLING_USER (ID,DESP,PWD) VALUES (?,?,?)"); pstmt1.setString(1,"fairy"); pstmt1.setString(2,"王涛"); pstmt1.setString(3,"werewi"); pstmt1.execute(); /* PL/SQL块语法:注意,要完全符合PL/SQL语法,Oracle的VARCHAR2不是标准的SQL类型,所以使用Types.CHAR */ cstmt = conn.prepareCall("begin ? := xling_pkg_tools.rc4(?); end;"); cstmt.registerOutParameter(1,Types.CHAR); cstmt.setString(2,"fp51gfa"); cstmt.execute(); System.out.println(cstmt.getString(1)); /* SQL-92语法,调用Oracle里的函数,注意:call只能小写 */ cstmt1 = conn.prepareCall("{? = call XLING_PKG_TOOLS.RC4(?)}"); cstmt1.registerOutParameter(1,Types.CHAR); cstmt1.setString(2,"xling"); cstmt1.execute(); System.out.println(cstmt1.getString(1)); /* 用SQL-92格式调用Oracle里的过程,第二个参数为OUT类型的参数 CREATE OR REPLACE PROCEDURE PRO_TEST(I_DATE_STRING IN VARCHAR2,O_DAYS OUT NUMBER) AS BEGIN SELECT SYSDATE - TO_DATE(I_DATE_STRING,'YYYYMMDD') INTO O_DAYS FROM DUAL; END; */ cstmt2 = conn.prepareCall("{call PRO_TEST(?,?)}"); cstmt2.setString(1,"20060901"); cstmt2.registerOutParameter(2,Types.INTEGER); cstmt2.execute(); System.out.println(cstmt2.getInt(2)); /* 用PL/SQL格式调用Oracle里的过程 */ cstmt3 = conn.prepareCall("begin PRO_TEST(?,?); END;"); cstmt3.setString(1,"20060101"); cstmt3.registerOutParameter(2,Types.INTEGER); cstmt3.execute(); System.out.println(cstmt3.getInt(2)); cstmt3.close(); cstmt2.close(); cstmt1.close(); cstmt.close(); pstmt.close(); pstmt1.close(); stmt.close(); conn.close(); System.out.println("here"); }catch(SQLException e){ //e.printStackTrace(); System.out.println("ErrorCode:" + e.getErrorCode());//错误号 System.out.println("Message:" + e.getMessage()); StackTraceElement[] el = e.getStackTrace(); for(int i = 0;i System.out.println("错误行号:" + el[i].getLineNumber()); System.out.println("所在方法:" + el[i].getMethodName()); System.out.println("所在类:" + el[i].getClassName()); System.out.println("所在文件:" + el[i].getFileName()); System.out.println(); } } } } |