pgsql的存储过程调用mysql_JDBC中调用Postgresql存储过程

本文展示了如何使用Java通过JDBC调用PostgreSQL的存储过程,包括传递输入参数、注册输出参数并获取结果。示例涵盖了不同类型存储过程的调用方式。
摘要由CSDN通过智能技术生成

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());

}

}

}

运行结果:

sum=11

product=24

例子二

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());

}

}

}

例子三

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());

}

}

}

运行结果:

org.postgresql.jdbc4.Jdbc4ResultSet@c31d6f2

Name : 王海滨

Name : 李寻欢

Name : 张铁头

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值