存储过程的实验

使用JDBC CallableStatements执行存储过程

  CallableStatement的所有超级接口为PreparedStatement、Statement、Wrapper。其中继承自PreparedStatement接口。CallableStatement主要是调用数据库中的存储过程。在使用CallableStatement时可以接收存储过程的返回值。CallableStatement对象为所有的DBMS提供了一种标准的形式去调用数据库中已存在的存储过程。对数据库中存储过程的调用是CallableStatement对象所含的内容。有两种形式:1:形式带结果参数;2:形式不带结果参数。结果参数是一种输出参数(存储过程中的输出OUT参数),是存储过程的返回值。两种形式都有带有数量可变的输入、输出、输入和输出的参数。用问号做占位符。

形式带结果参数语法格式:{ ? = call 存储过程名[(?, ?, ?, ...)]};

形式不带结果参数语法格式:{ call 存储过程名[(?, ?, ?, ...)]};PS方括号里面的内容可有可无。

CallableStatement接口中常用的方法。

1:getInt(int parameterIndex)、getInt(String parameterName)、还有getString、getBigDecimal、getString、getDate、getURL等等都类似和PreparedStatement与Statement中的用法类似。

2:registerOutParameter(int parameterIndex, int sqlType):按顺序位置parameterIndex将OUT参数注册为JDBC类型sqlType。

3:wasNull():查询最后一个读取的OUT参数是否为SQL Null。等等还有很多方法,感兴趣的读者可以自行查阅JDK API文档。

讲解了那么多,不如一个例子来的痛快。下面通过一个例子让读者更清楚的看到CallableStatement的用法。

首先在原先的t_employee表中添加表示干了多少年的tyear字段。

1 alter table t_employee add tyear int;

在数据库中编写存储过程统计指定id的userName的人,输出一下他一共赚了多少钱。

JDBC代码:

  1 package com.panli.dbutil;
  2 /**
  3  * 连接数据库
  4  */
  5 import java.sql.CallableStatement;
  6 import java.sql.Connection;
  7 import java.sql.DriverManager;
  8 import java.sql.PreparedStatement;
  9 import java.sql.ResultSet;
 10 import java.sql.SQLException;
 11 import java.sql.Statement;
 12
 13 public class DbUtil {
 14     //数据库驱动名字
 15     private static String jdbcName = "com.mysql.jdbc.Driver";
 16     //数据库协议地址
 17     private static String dbUrl = "jdbc:mysql://localhost:3306/db_user";
 18     //数据库用户名
 19     private static String dbUser = "root";
 20     //数据库密码
 21     private static String dbPassword = "123456";
 22
 23
 24     /**
 25      * 获取连接
 26      * @return
 27      * @throws Exception
 28      */
 29     public static Connection getCon() throws Exception{
 30         Class.forName(jdbcName);
 31         Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
 32         return conn;
 33     }
 34
 35     /**
 36      * 关闭连接
 37      * @param stmt
 38      * @param conn
 39      * @throws Exception
 40      */
 41     public static void close(Statement stmt,Connection conn) throws Exception{
 42         if(stmt!=null){
 43             stmt.close();
 44             if(conn!=null){
 45                 conn.close();
 46             }
 47         }
 48     }
 49
 50     /**
 51      * 关闭连接
 52      * @param cstmt
 53      * @param conn
 54      * @throws Exception
 55      */
 56     public static void close(CallableStatement cstmt, Connection conn) throws Exception{
 57         if(cstmt!=null){
 58             cstmt.close();
 59             if(conn!=null){
 60                 conn.close();
 61             }
 62         }
 63     }
 64
 65
 66     /**
 67      * 关闭连接
 68      * @param pstmt
 69      * @param conn
 70      * @throws SQLException
 71      */
 72     public static void close(PreparedStatement pstmt, Connection conn) throws SQLException{
 73         if(pstmt!=null){
 74             pstmt.close();
 75             if(conn!=null){
 76                 conn.close();
 77             }
 78         }
 79     }
 80
 81
 82     /**
 83      * 重载关闭方法
 84      * @param pstmt
 85      * @param conn
 86      * @throws Exception
 87      */
 88     public void close(ResultSet rs,PreparedStatement pstmt, Connection conn) throws Exception{
 89         if(rs!=null){
 90             rs.close();
 91             if(pstmt!=null){
 92                 pstmt.close();
 93                 if(conn!=null){
 94                     conn.close();
 95                 }
 96
 97             }
 98         }
 99
100     }
101 }
  1 package com.panli.model;
  2
  3 import java.io.File;
  4
  5 /**
  6  * model包下的cemployee类,对每个字段进行建模
  7  * @author Peter
  8  *
  9  */
 10 public class CEmployee {
 11     private int id;
 12     private String userName;
 13     private double salary;
 14     private String job;
 15     private int jobTypeId;
 16     private File context;
 17     private File pic;
 18     private double counts;
 19     /**
 20      * 默认的构造方法
 21      */
 22     public CEmployee() {
 23         super();
 24         // TODO Auto-generated constructor stub
 25     }
 26
 27     /**
 28      * 带一个参数的构造方法
 29      * @param id
 30      */
 31     public CEmployee(int id) {
 32         super();
 33         this.id = id;
 34     }
 35
 36     /**
 37      * 两个参数的构造方法
 38      * @param counts
 39      * @param userNames
 40      */
 41     public CEmployee(double counts, String userName) {
 42         // TODO Auto-generated constructor stub
 43         this.counts = counts;
 44         this.userName = userName;
 45     }
 46
 47     /**
 48      * 重写toString()方法
 49      */
 50     @Override
 51     public String toString(){
 52         return userName+"一共赚了"+counts+"钱";
 53     }
 54     public int getId() {
 55         return id;
 56     }
 57     public void setId(int id) {
 58         this.id = id;
 59     }
 60     public String getUserName() {
 61         return userName;
 62     }
 63     public void setUserName(String userName) {
 64         this.userName = userName;
 65     }
 66     public double getSalary() {
 67         return salary;
 68     }
 69     public void setSalary(double salary) {
 70         this.salary = salary;
 71     }
 72     public String getJob() {
 73         return job;
 74     }
 75     public void setJob(String job) {
 76         this.job = job;
 77     }
 78     public int getJobTypeId() {
 79         return jobTypeId;
 80     }
 81     public void setJobTypeId(int jobTypeId) {
 82         this.jobTypeId = jobTypeId;
 83     }
 84
 85     public File getContext() {
 86         return context;
 87     }
 88
 89     public void setContext(File context) {
 90         this.context = context;
 91     }
 92
 93     public File getPic() {
 94         return pic;
 95     }
 96
 97     public void setPic(File pic) {
 98         this.pic = pic;
 99     }
100
101     public double getCounts() {
102         return counts;
103     }
104
105     public void setCounts(double counts) {
106         this.counts = counts;
107     }
108
109 }
 1 package com.panli.dao;
 2
 3 import java.sql.CallableStatement;
 4 import java.sql.Connection;
 5 import java.sql.Types;
 6 import java.util.ArrayList;
 7 import java.util.List;
 8
 9 import com.panli.dbutil.DbUtil;
10 import com.panli.model.CEmployee;
11
12 public class CountsEmployeeDao {
13     private static DbUtil dbUtil = new DbUtil();
14     /**
15      * 调用存储过程得到指定ID用户的一共赚了多少钱
16      * @param employee
17      * @return
18      * @throws Exception
19      */
20     public static List getCountsById(CEmployee cemployee)throws Exception{
21         List list = new ArrayList();
22         Connection conn = dbUtil.getCon();
23         String sql = "{call pro_getCountById(?, ?, ?)}";
24         CallableStatement cstmt = conn.prepareCall(sql);
25         cstmt.setInt(1, cemployee.getId());
26         cstmt.registerOutParameter(2, Types.DOUBLE);
27         cstmt.registerOutParameter(3, Types.VARCHAR);
28         cstmt.execute();
29         double counts = cstmt.getDouble("counts");
30         String userNames = cstmt.getString("userNames");
31         CEmployee emp = new CEmployee(counts, userNames);
32         list.add(emp);
33         dbUtil.close(cstmt, conn);
34         return list;
35     }
36     /**
37      * 做测试的主方法
38      * @param args
39      */
40     public static void main(String[] args)throws Exception {
41
42         CEmployee cemployee = new CEmployee(1);
43         List list = getCountsById(cemployee);
44         for(CEmployee cemp: list){
45             System.out.println(cemp);
46         }
47     }
48 }

创建的存储过程为:

 1 delimiter &&
 2 create procedure pro_getCountById(in tid int, out counts double, out userNames varchar(20))
 3 begin
 4   select salary*tyear into counts from t_employee where id = tid;
 5   select userName into userNames from t_employee where id = tid;
 6 end
 7 &&
 8
 9 测试:
10 call pro_getCountById(1, @counts, @userNames);
11 select @counts, @userNames;

原文地址:https://www.cnblogs.com/vision-xixi/p/11066930.html

时间: 2024-10-31 20:07:03

存储过程的实验的相关文章

使用PL/SQL编写存储过程访问数据库

一.实验目的 熟悉使用存储过程来进行数据库应用程序的设计. 二.实验内容 对学生-课程数据库,编写存储过程,完成下面功能: 1.统计离散数学的成绩分布情况,即按照各分数段统计人数: 2.统计任意一门课的平均成绩: 3.将学生选课成绩从百分制改为等级制(即A.B.C.D.E). 要求:提交源程序并表示必要的注释.保证程序能正确编译和运行,认真填写实验报告. 三.实验步骤 实验之前,已经建立数据库,有student,course和sc三张基本表. (一)统计离散数学的成绩分布情况,即按照各分数段统计

实验八 存储过程1

实验八存储过程 一.  实验内容: 1. 存储过程的创建 2. 存储过程的调用 二.  实验项目:学生成绩数据库 创建用于学生成绩管理数据库,数据库名为XSCJ中,XSCJ数据库中包括三个表:xs(学生基本情况表).kc(课程信息表).xs_cj(成绩表). 三.  实验步骤:(要求每个存储过程创建成功之后必须进行调用检验) 1.   在xscj数据库中创建存储过程, 实现的功能是删除一个特定的学生信息. 2.   创建一个存储过程,判断两个输入参数哪个更大,并将较大的值返回: 3.   创建一

实验八 存储过程2

实验八存储过程 一.  实验内容: 1. 存储过程的创建 2. 存储过程的调用 二.  实验项目:学生成绩数据库 创建用于学生成绩管理数据库,数据库名为XSCJ中,XSCJ数据库中包括三个表:xs(学生基本情况表).kc(课程信息表).xs_cj(成绩表). 三.  实验步骤:(要求每个存储过程创建成功之后必须进行调用检验) 1.   在xscj数据库中创建存储过程,将xs表中的前15条记录复制到一个新表xs1显示中,并查看新表内容: 2.   创建存储过程,修改显示xs1表中学生的性别,当性别

实验9-6 编写一个存储过程proc_test_stat1

在TestDB数据库中,编写一个存储过程proc_test_stat1,要求: 1)参数 字符串@target  长度 512: 2)要求返回一个结果集: 每个英文单词及其对应的出现次数,别名分别是word,count 注意:@target中仅包含英文单词,单词之间使用空格分隔. 提示:先根据空格分隔字符串得到单词,将每个单词放入临时表,然后在临时表上进行统计. 测试语句: proc_test_stat1 'Whatever is worth doing is worth doing well'

实验9-5 编写一个存储过程proc_test_stat

在TestDB数据库中,编写一个存储过程proc_test_stat: 1)参数1 @target 类型nvarchar 长度 256 2)要求返回以下结果集: 字符及其在 @target 中出现的次数,字段名分别是c, count 注意:字符串可能包含:符号,数字,字母,汉字等 提示:在临时数据库中创建一个表,保存字符统计结果 测试语句: proc_test_stat '我是1个中国人, and you are an english,' create procedure proc_test_s

plsql存储过程和函数

8. 存储子程序(命名块) 存储子程序下面三种:(1) 存储过程:store procedure(SP)(2) 函数:function(FUN)(3) 包和包体:package/package body(PKG) 存储过程:oracle的一种对象v_sqlcodeA 在一个用户下有唯一的名字B 存储在数据库中C 可以接收传入参数并且有多个返回值D 可以直接执行和在其他程序中调用E 不可以被select语句调用 函数:oracle的一种对象A 在一个用户下有唯一的名字B 存储在数据库中C 可以接收

数据库表的创建、管理和数据操作(实验一),数据库创建

数据库表的创建.管理和数据操作(实验一),数据库创建 今天我们就以实验的形式对表的创建.管理和数据操作进行学习,上课吧. [实验目的]:了解SQL语言的使用,进一步理解关系运算,巩固数据库的基础知识.[实验要求]:利用SQL语言进行数据库表的各种操作:1.数据库表的创建.修改和删除操作.2.向表中进行数据的插入.删除和修改操作.[实验内容]1. 利用数据定义语句在实验一创建的stu_DB库中建立学生管理系统的三个表:Student.Course.SC.2.利用INSERT.UPDATE和DELE

MySQL存储过程的“异常处理”

Q:何为异常? A:程序在执行过程中有可能出错,运行时错误叫做异常. 默认情况下,当存储过程运行出错时,过程会立即终止,并打印系统错误消息. 实验环境: mysql> use TENNIS Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> 

mybatis调用oracle存储过程

存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的存储过程 我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号 CREATE OR REPLACE Procedure cascadeoperation As Begin  Delete From teacher Where id=1;  Update studentdetail S