CallableStatement简单使用

直接上存储过程、函数

--执行不带参数但带返回值的存储过程
CREATE OR REPLACE PROCEDURE proc_getUserCount(v_totalCount OUT NUMBER) AS
BEGIN
  SELECT COUNT(*) INTO v_totalCount FROM vote_user;
END;
--测试不带参数但带返回值的存储过程
DECLARE
  v_totalCount NUMBER;
BEGIN
  proc_getUserCount(v_totalCount);
  dbms_output.put_line(v_totalCount);
END;
--执行带参数返回值的存储过程
CREATE OR REPLACE PROCEDURE proc_getUserCountCondit(username IN VARCHAR2,
  v_totalCount OUT NUMBER) AS
BEGIN
  SELECT COUNT(*) INTO v_totalCount FROM vote_user
  WHERE vu_user_name LIKE ‘%‘ || username || ‘%‘;
END;
--测试带参数返回值的存储过程
DECLARE
  v_username VARCHAR2(20) := ‘accp‘;
  v_totalCount NUMBER;
BEGIN
  proc_getUserCountCondit(v_username,v_totalCount);
  dbms_output.put_line(v_totalCount);
END;

--执行返回值为游标的存储过程
CREATE OR REPLACE PROCEDURE proc_getUser(cursor_user OUT sys_refcursor) AS
BEGIN
  OPEN cursor_user
  FOR
    SELECT vu_user_name,vu_password FROM vote_user;
END;
--测试执行返回值为游标的存储过程
DECLARE
  cursor_user SYS_REFCURSOR;
  v_username VARCHAR2(20);
  v_password VARCHAR2(20);
BEGIN
  proc_getUser(cursor_user);
  LOOP
    FETCH cursor_user INTO v_username,v_password;
    EXIT WHEN cursor_user%NOTFOUND;
    dbms_output.put_line(‘用户名:‘ || v_username || ‘,密码:‘ || v_password);
  END LOOP;
END;
--执行函数
CREATE OR REPLACE FUNCTION func_getUserName(user_id VARCHAR2)
  RETURN VARCHAR2
  IS username VARCHAR2(20);
BEGIN
    SELECT vu_user_name INTO username FROM vote_user
    WHERE vu_user_id = user_id;
    RETURN username;
    EXCEPTION
      WHEN no_data_found THEN
        RETURN ‘雇员编号未找到‘;
END;
--测试函数
DECLARE
  username VARCHAR2(20);
BEGIN
  username := func_getUserName(‘accp2‘);
  dbms_output.put_line(‘用户名:‘ || username);
END;

Java示例代码

/**
 * cn.jbit.news.test.Demo2
 * 2014-4-27
 * gyy
 */
package cn.jbit.news.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleTypes;

import cn.jbit.news.entity.User;
import cn.jbit.news.util.ConfigManager;

public class Demo2 {

	private ConfigManager config = ConfigManager.getInstance();

	// 执行不带参数但是有返回值的存储过程
	public int getUserCount() {
		int rowsCount = 0;

		try {
			Class.forName(config.getString("jdbc.driver_class"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Connection conn = null;
		CallableStatement cstmt = null;
		try {
			conn = DriverManager.getConnection(
					config.getString("jdbc.connection.url"),
					config.getString("jdbc.connection.username"),
					config.getString("jdbc.connection.password"));
			String sql = "{call proc_getUserCount(?)}";
			// 创建CallableStatement对象
			cstmt = conn.prepareCall(sql);
			// 注册输出参数
			cstmt.registerOutParameter(1, Types.INTEGER);
			// 执行存储过程
			cstmt.execute();
			rowsCount = cstmt.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rowsCount;
	}

	// 执行带参数带返回值的存储过程
	public int getUserCountByName(String username) {
		int rowsCount = 0;

		try {
			Class.forName(config.getString("jdbc.driver_class"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Connection conn = null;
		CallableStatement cstmt = null;
		try {
			conn = DriverManager.getConnection(
					config.getString("jdbc.connection.url"),
					config.getString("jdbc.connection.username"),
					config.getString("jdbc.connection.password"));
			String sql = "{call proc_getUserCountCondit(?,?)}";
			// 创建CallableStatement对象
			cstmt = conn.prepareCall(sql);
			// 输入参数赋值
			cstmt.setString(1, username);
			// 注册输出参数
			cstmt.registerOutParameter(2, Types.INTEGER);
			// 执行存储过程
			cstmt.execute();
			rowsCount = cstmt.getInt(2);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rowsCount;
	}

	// 执行返回值为游标的存储过程执行返回值为游标的存储过程
	public List<User> getUserListByProc() {
		List<User> userList = null;

		try {
			Class.forName(config.getString("jdbc.driver_class"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Connection conn = null;
		CallableStatement cstmt = null;
		ResultSet rs = null;
		try {
			conn = DriverManager.getConnection(
					config.getString("jdbc.connection.url"),
					config.getString("jdbc.connection.username"),
					config.getString("jdbc.connection.password"));
			String sql = "{call PROC_GETUSER(?)}";
			// 创建CallableStatement对象
			cstmt = conn.prepareCall(sql);
			// 注册输出参数
			cstmt.registerOutParameter(1, OracleTypes.CURSOR);
			// 执行存储过程
			cstmt.execute();
			rs = (ResultSet) cstmt.getObject(1);
			userList = new ArrayList<User>();
			while (rs.next()) {
				String username = rs.getString("VU_USER_NAME");
				String password = rs.getString("VU_PASSWORD");
				User user = new User();
				user.setUsername(username);
				user.setPassword(password);
				userList.add(user);// 添加用户
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return userList;
	}

	// 函数
	public String getUserNameById(String userId) {
		String username = "";

		try {
			Class.forName(config.getString("jdbc.driver_class"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Connection conn = null;
		CallableStatement cstmt = null;
		try {
			conn = DriverManager.getConnection(
					config.getString("jdbc.connection.url"),
					config.getString("jdbc.connection.username"),
					config.getString("jdbc.connection.password"));
			String sql = "{? = call FUNC_GETUSERNAME(?)}";
			// 创建CallableStatement对象
			cstmt = conn.prepareCall(sql);
			// 输入参数赋值
			cstmt.setString(2, userId);
			// 注册输出参数
			cstmt.registerOutParameter(1, Types.VARCHAR);
			// 执行存储过程
			cstmt.execute();
			username =  cstmt.getString(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return username;
	}

	public static void main(String[] args) {
		Demo2 d = new Demo2();
		System.out.println("用户人数:" + d.getUserCount());
		System.out.println("模糊查询-------用户人数:" + d.getUserCountByName("accp"));
		List<User> userList = d.getUserListByProc();
		for (User user : userList) {
			System.out.println("用户名:" + user.getUsername() + ",密码:"
					+ user.getPassword());
		}
		System.out.println(d.getUserNameById("accp"));
	}
}
时间: 2024-10-06 00:53:47

CallableStatement简单使用的相关文章

简单地java链接oracle数据库

简单地模拟了银行账户之间相互转账的功能,该项目在java代码中分为了4个包 1.调用数据库的存储过程 import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import entity.UserInfo; import util.DBUtil;

通过JDBC进行简单的增删改查

通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)update (5)select (6)delete 四.测试 五.代码分析 六.思考问题 前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)

通过JDBC进行简单的增删查改

目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)update (5)select (6)delete 四.测试 五.代码分析 六.思考问题 前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的

MySQL数据库学习笔记(八)----JDBC入门及简单增删改查数据库的操作

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4050825.html 联系方式:[email protected] [正文]                                                                                                               

MySQL数据库的简单操作

[一]JDBC驱动分类: 1:JDBC--ODBC 桥驱动. 在程序开发中不用此驱动类型,因为操作性能太低. 2:纯JDBC链接(JDBC本地驱动:本地协议纯JDBC驱动). 3:JDBC网络驱动. 4:数据库的操作过程: 〈1〉打开数据库的服务                    〈2〉连接数据库,连接的时候以表达都要输入用户名和密码. 〈3〉操作数据库:创建表, 查询表, 跟新纪录.   〈4〉数据库的操作:Statement,  PreparedStatement. 〈5〉数据库的查询:

MyBatis学习--简单的增删改查

jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] args) { 2 Connection connection = null; 3 PreparedStatement preparedStatement = null; 4 ResultSet resultSet = null; 5 6 try { 7 //加载数据库驱动 8 Class.forName

通过JDBC进行简单的增删改查(以MySQL为例) 目录

通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)update (5)select (6)delete 四.测试 五.代码分析 六.思考问题 前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)

JDBC PreparedStatement ,CallableStatement,以及事务,回滚举例

程序中用到的类,文件,jar 代码: 1,文件:db.properties文件内容 user=rootpassword=123url=jdbc:mysql:///student_dbdriver=com.mysql.jdbc.Driveraaa 2,类Utils.class import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException

spring中的JdbcTemplate简单记录

JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修改.删除等语句:batchUpdate方法用于执行批处理相关语句: query方法及queryForXXX方法:用于执行查询相关语句: call方法:用于执行存储过程.函数相关语句. JdbcTemplate类支持的回调类: 预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创