直接上存储过程、函数

--运行不带參数但带返回值的存储过程
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"));
}
}

CallableStatement简单使用的更多相关文章

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

    目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 ( ...

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

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...

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

    通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...

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

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. Statement,PreparedStatement和CallableStatement的联系和区别

    联系: CallableStatement继承自PreparedSatement,PreparedStatement继承自Statement. 区别: 1:Statement 每次执行sql语句,数据 ...

  6. Java存储过程调用CallableStatement

    什么是存储过程? 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有 ...

  7. TypeHandler的简单实例

    转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...

  8. java使用注解和反射打造一个简单的jdbc工具类

    a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...

  9. JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】

    1.什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 2.为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要 ...

随机推荐

  1. python开发_re和counter

    python中re和counter的结合,可以实现以下的功能: 1.获取字符串或者文件中的单词组 2.对单词组进行统计 下面是我做的demo 运行效果: ======================= ...

  2. MySQL的max_user_connections拒绝连接的一次踩雷经验

    近期线上的数据遇到一个问题,最终原因为max_user_connections和max_connections的一个bug导致,具体过程如下 现象 前端页面不断的出现错误页面. 排查处理过程 按照数据 ...

  3. SUSE Linux忘记root密码的对策

    1)开机,进入GRUB界面: 此时有两个选择: SUSE LINUX ENTERPISE SERVER 10 SUSE LINUX ENTERPISE SERVER 10 (Failsafe) 移动光 ...

  4. CentOS 6.9/7通过yum安装指定版本的Nginx

    说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql nginx可以知道全部文件的地方等等. Nginx(1.12.2) 一.安装和配置 1.安装 # rp ...

  5. InvalidateRect()与Invalidate()的用法(转)

    BOOL InvalidateRect(   HWND hWnd,           // 窗口句柄   CONST RECT* lpRect,   // 矩形区域   BOOL bErase    ...

  6. Sublime的中文GBK显示乱码的解决方法

    import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd ...

  7. Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别

    转:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_a ...

  8. mongodb的分布式集群(2、副本集)

    概述        副本集是主从复制的一种,是一种自带故障转移功能的主从复制.攻克了上述主从复制的缺点.实现主server发生问题后.不需人为介入.系统自己主动从新选举一个新的主server的功能. ...

  9. java通过jacob来读取word转换为htm格式

    转自:http://blog.csdn.net/chinapi_hzh/article/details/5798689 因为微软没有公开word源代码,所以直接用java流来读取word的后果是读出来 ...

  10. 《iOS应用逆向工程:分析与实战》

    <iOS应用逆向工程:分析与实战> 基本信息 作者: 沙梓社    吴航    刘瑾 丛书名: 信息安全技术丛书 出版社:机械工业出版社 ISBN:9787111450726 上架时间:2 ...