﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-niexiong-文章分类-数据库</title><link>http://www.blogjava.net/niexiong/category/22060.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 30 Apr 2007 23:00:36 GMT</lastBuildDate><pubDate>Mon, 30 Apr 2007 23:00:36 GMT</pubDate><ttl>60</ttl><item><title>Java调用Oracle存储过程返回结果集 </title><link>http://www.blogjava.net/niexiong/articles/114179.html</link><dc:creator>niexiong</dc:creator><author>niexiong</author><pubDate>Fri, 27 Apr 2007 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/niexiong/articles/114179.html</guid><description><![CDATA[<p style="FONT-SIZE: 10pt">Oracle 存储过程返回结果集用 ref cursor 实现。<br>试验步骤如下：</p>
<p style="FONT-SIZE: 10pt">1. 建立 ref cursor 类型和过程</p>
<p style="FONT-SIZE: 10pt">CREATE OR REPLACE PACKAGE types<br>AS<br>&nbsp;&nbsp;&nbsp; TYPE ref_cursor IS REF CURSOR;<br>END;<br>/</p>
<p style="FONT-SIZE: 10pt">CREATE TABLE STOCK_PRICES(<br>&nbsp;&nbsp;&nbsp; RIC VARCHAR(6) PRIMARY KEY,<br>&nbsp;&nbsp;&nbsp; PRICE NUMBER(7,2),<br>&nbsp;&nbsp;&nbsp; UPDATED DATE );<br>/</p>
<p style="FONT-SIZE: 10pt">CREATE OR REPLACE FUNCTION sp_get_stocks(v_price IN NUMBER) <br>&nbsp;&nbsp;&nbsp; RETURN types.ref_cursor<br>AS<br>&nbsp;&nbsp;&nbsp; stock_cursor types.ref_cursor;<br>BEGIN<br>&nbsp;&nbsp;&nbsp; OPEN stock_cursor FOR <br>&nbsp;&nbsp;&nbsp; SELECT ric,price,updated FROM stock_prices WHERE price &lt; v_price;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; RETURN stock_cursor;<br>END;</p>
<p style="FONT-SIZE: 10pt">2. 用 sqlplus 测试过程</p>
<p style="FONT-SIZE: 10pt">SQL&gt; var results refcursor<br>SQL&gt; exec :results := sp_get_stocks(20.0)<br>SQL&gt; print results</p>
<p style="FONT-SIZE: 10pt">3. 从 Java 调用</p>
<p style="FONT-SIZE: 10pt">import java.sql.*;<br>import java.io.*;<br>import oracle.jdbc.driver.*;</p>
<p style="FONT-SIZE: 10pt">public class JDBCDemo {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Compile-time flag for deciding which query to use<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private boolean useOracleQuery = true;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Class name of Oracle JDBC driver<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private String driver = "oracle.jdbc.driver.OracleDriver";</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Initial url fragment<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private String url = "jdbc:oracle:thin:@";</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Standard Oracle listener port<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private String port = "1521";</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Oracle style of calling a stored procedure<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private String oracleQuery = "begin ? := sp_get_stocks(?); end;";</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * JDBC style of calling a stored procedure<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private String genericQuery = "{ call ? := sp_get_stocks(?) }";</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Connection to database<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private Connection conn = null;</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Constructor. Loads the JDBC driver and establishes a connection<br>&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; * @param host the host the db is on<br>&nbsp;&nbsp;&nbsp; * @param db the database name<br>&nbsp;&nbsp;&nbsp; * @param user user's name<br>&nbsp;&nbsp;&nbsp; * @param password user's password<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public JDBCDemo(String host, String db, String user, String password)<br>&nbsp;&nbsp;&nbsp; throws ClassNotFoundException, SQLException {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // construct the url<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = url + host + ":" + port + ":" + db;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // load the Oracle driver and establish a connection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(driver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection(url, user, password);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (ClassNotFoundException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Failed to find driver class: " + driver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Failed to establish a connection to: " + url);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Execute the stored procedure<br>&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; * @param price price parameter for stored procedure<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void execute(float price)<br>&nbsp;&nbsp;&nbsp; throws SQLException {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String query = useOracleQuery ? oracleQuery : genericQuery;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Query: " + query + "n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement stmt = conn.prepareCall(query);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // register the type of the out param - an Oracle specific type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.registerOutParameter(1, OracleTypes.CURSOR);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set the in param<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.setFloat(2, price);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // execute and retrieve the result set<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.execute();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = (ResultSet)stmt.getObject(1);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // print the results<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rs.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rs.getString(1) + "t" +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.getFloat(2) + "t" +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.getDate(3).toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Cleanup the connection<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void cleanup() throws SQLException {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (conn != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Prints usage statement on stdout<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; static private void usage() {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("java com.enterprisedt.demo.oracle.JDBCDemo " +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " host db user password price");<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; * Runs the class<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length != 5) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDBCDemo.usage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // assign the args to sensible variables for clarity<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String host = args[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String db = args[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String user = args[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String password = args[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float price = Float.valueOf(args[4]).floatValue();</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // and execute the stored proc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDBCDemo jdbc = new JDBCDemo(host, db, user, password);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc.execute(price);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc.cleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (ClassNotFoundException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Demo failed");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Demo failed: " + ex.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p style="FONT-SIZE: 10pt"><br>&nbsp;</p>
<img src ="http://www.blogjava.net/niexiong/aggbug/114179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/niexiong/" target="_blank">niexiong</a> 2007-04-27 19:09 <a href="http://www.blogjava.net/niexiong/articles/114179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>