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"));
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章