package www.zjptcc.wxw.jdbctest.psql; /* * CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$ BEGIN sum := x + y; prod := x * y; END; $$ LANGUAGE plpgsql; 或 CREATE OR REPLACE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT prod int) AS $$ SELECT $1 + $2, $1 * $2 $$ LANGUAGE SQL; * * */ import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class TestPsqlSp1 { /** * @param args */ public static void main(String[] args) { // TODO 自動生成的方法存根 try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgresql://127.0.0.1:5432/you_db";// 數據庫名 Connection conn = DriverManager.getConnection(url, "you_user","you_passwd"); /* sum_n_product(x int, y int, OUT sum int, OUT prod int) 是將輸入參數x,y * 的和放入第三個參數sum(輸出參數),x,y的積放入第四個參數prod(輸出參數) * */ String procedure = "{ call sum_n_product(?, ?, ?, ?)}"; CallableStatement statement = conn.prepareCall(procedure); //經過 setXXX 方法將值傳給IN參數 statement.setInt(1, 3); statement.setInt(2, 8); //registerOutParameter註冊輸出參數sum,prod,輸出參數的索引值是3,4 //參數的索引值是根據佔位符?出現的次序從左到右由1開始計,無論其是輸入仍是輸出參數 statement.registerOutParameter(3,Types.INTEGER); statement.registerOutParameter(4,Types.INTEGER); statement.execute(); //打印輸出參數sum的值 System.out.println("sum="+statement.getInt(3)); System.out.println("product="+statement.getInt(4)); conn.close(); } catch (SQLException sqe) { System.out.println("Unexpected exception : " + sqe.toString() + ", sqlstate = " + sqe.getSQLState()); System.exit(1); } catch (Exception e) { System.out.println(e.getMessage()); } } }
運行結果:java
sum=11sql
product=24數據庫
例子二post
package www.zjptcc.wxw.jdbctest.psql; /* create table t123(id int primary key, col2 varchar(32) not null); insert into t123 values(1, 'iihero'); insert into t123 values(2, 'Sybase'); insert into t123 values(3, 'ASE'); CREATE OR REPLACE FUNCTION test_proc (int, OUT num_t123 int) AS $$ DECLARE id_min ALIAS FOR $1; BEGIN select count( a.id ) into num_t123 from t123 a where a.id >= id_min; END $$ LANGUAGE plpgsql; mymotif=> select test_proc(1); mymotif=> drop FUNCTION test_proc(int, OUT num_t123 int); * * */ import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class TestPsqlSp2 { /** * @param args */ public static void main(String[] args) { // TODO 自動生成的方法存根 try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgresql://127.0.0.1:5432/you_db";// 數據庫名 Connection conn = DriverManager.getConnection(url, "you_user","you_passwd"); /* test_proc(@id_min int, @num_t123 int output))是將表t123中的id字段中大於等於第一個參數@id_min 的數目統計好,放到第二個參數@num_t123(輸出參數) */ String procedure = "{ call test_proc(?, ?)}"; CallableStatement statement = conn.prepareCall(procedure); //經過 setXXX 方法將IN參數傳給@id_min,其中第一個1是參數的索引值,第二個1是傳給@id_min的值 statement.setInt(1, 1); //registerOutParameter註冊輸出參數@num_t123,輸出參數的索引值是2 //參數的索引值是根據佔位符?出現的次序從左到右由1開始計,無論其是輸入仍是輸出參數 statement.registerOutParameter(2,Types.INTEGER); statement.execute(); //打印輸出參數@num_t123的值 System.out.print(statement.getInt(2)); conn.close(); } catch (SQLException sqe) { System.out.println("Unexpected exception : " + sqe.toString() + ", sqlstate = " + sqe.getSQLState()); System.exit(1); } catch (Exception e) { System.out.println(e.getMessage()); } } }
例子三url
package www.zjptcc.wxw.jdbctest.psql; /* * CREATE TABLE STUDENT (sno int, sname varchar(32)); insert into STUDENT values(1, '王海濱'); insert into STUDENT values(2, '李尋歡 '); insert into STUDENT values(3, '張鐵頭'); CREATE OR REPLACE FUNCTION sp_stu_sel() RETURNS refcursor AS $$ declare ref refcursor; BEGIN open ref for select * from STUDENT; return ref; END; $$ LANGUAGE plpgsql; * * */ import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; public class TestPsqlSpStu { /** * @param args */ public static void main(String[] args) { // TODO 自動生成的方法存根 try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgresql://127.0.0.1:5432/you_db";// 數據庫名 Connection conn = DriverManager.getConnection(url, "you_name", "you_passwd"); conn.setAutoCommit(false); // return refcursor must within a transaction String procedure = "{ ? = call sp_stu_sel()}"; CallableStatement statement = conn.prepareCall(procedure); // 參數的索引值是根據佔位符?出現的次序從左到右由1開始計,無論其是輸入仍是輸出參數 statement.registerOutParameter(1, Types.OTHER); statement.execute(); ResultSet result = (ResultSet) statement.getObject(1); System.out.println(result); while (result.next()) { System.err.println("Name : " + result.getString("sname")); //getString(2) } conn.commit(); // 打印輸出返回值 conn.close(); } catch (SQLException sqe) { System.out.println("Unexpected exception : " + sqe.toString() + ", sqlstate = " + sqe.getSQLState()); System.exit(1); } catch (Exception e) { System.out.println(e.getMessage()); } } }
運行結果:postgresql
org.postgresql.jdbc4.Jdbc4ResultSet@c31d6f2code
Name : 王海濱 索引
Name : 李尋歡 get
Name : 張鐵頭 it