/** * * Copyright (C) 2001 Enterprise Distributed Technologies Ltd * * www.enterprisedt.com * * This code is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug fixes, suggestions and comments should be sent to: * * bruce@enterprisedt.com * * or by snail mail to: * * Bruce P. Blackshaw * 53 Wakehurst Road * London SW11 6DB * United Kingdom * * Change Log: * * $Log$ * */ package com.enterprisedt.demo.oracle; import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; /** * Class demonstrates how an Oracle stored proc that * returns a result set can be called from Java * * @author Bruce Blackshaw * @version $Revision: 1.2 $ */ public class JDBCDemo { /** * Compile-time flag for deciding which query to use */ private boolean useOracleQuery = true; /** * Class name of Oracle JDBC driver */ private String driver = "oracle.jdbc.driver.OracleDriver"; /** * Initial url fragment */ private String url = "jdbc:oracle:thin:@"; /** * Standard Oracle listener port */ private String port = "1521"; /** * Oracle style of calling a stored procedure */ private String oracleQuery = "begin ? := sp_get_stocks(?); end;"; /** * JDBC style of calling a stored procedure */ private String genericQuery = "{ call ? := sp_get_stocks(?) }"; /** * Connection to database */ private Connection conn = null; /** * Constructor. Loads the JDBC driver and establishes a connection * * @param host the host the db is on * @param db the database name * @param user user's name * @param password user's password */ public JDBCDemo(String host, String db, String user, String password) throws ClassNotFoundException, SQLException { // construct the url url = url + host + ":" + port + ":" + db; // load the Oracle driver and establish a connection try { Class.forName(driver); conn = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException ex) { System.out.println("Failed to find driver class: " + driver); throw ex; } catch (SQLException ex) { System.out.println("Failed to establish a connection to: " + url); throw ex; } } /** * Execute the stored procedure * * @param price price parameter for stored procedure */ private void execute(float price) throws SQLException { String query = useOracleQuery ? oracleQuery : genericQuery; System.out.println("Query: " + query + "\n"); CallableStatement stmt = conn.prepareCall(query); // register the type of the out param - an Oracle specific type stmt.registerOutParameter(1, OracleTypes.CURSOR); // set the in param stmt.setFloat(2, price); // execute and retrieve the result set stmt.execute(); ResultSet rs = (ResultSet)stmt.getObject(1); // print the results while (rs.next()) { System.out.println(rs.getString(1) + "\t" + rs.getFloat(2) + "\t" + rs.getDate(3).toString()); } rs.close(); stmt.close(); } /** * Cleanup the connection */ private void cleanup() throws SQLException { if (conn != null) conn.close(); } /** * Prints usage statement on stdout */ static private void usage() { System.out.println("java com.enterprisedt.demo.oracle.JDBCDemo " + " host db user password price"); } /** * Runs the class */ public static void main(String[] args) throws Exception { if (args.length != 5) { JDBCDemo.usage(); System.exit(1); } else { try { // assign the args to sensible variables for clarity String host = args[0]; String db = args[1]; String user = args[2]; String password = args[3]; float price = Float.valueOf(args[4]).floatValue(); // and execute the stored proc JDBCDemo jdbc = new JDBCDemo(host, db, user, password); jdbc.execute(price); jdbc.cleanup(); } catch (ClassNotFoundException ex) { System.out.println("Demo failed"); } catch (SQLException ex) { System.out.println("Demo failed: " + ex.getMessage()); } } } }