直接上存储过程、函数
--执行不带参数但带返回值的存储过程
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"));
}
}