首先给大家出个题目,看看有想法没有,
求二者的关系
男A与女B结婚生了男C
男X与女Y结婚生了女Z
男C与女Z结婚...
这就是人间的结婚生子一代传一代的关系
(要考虑一人多次结婚的情况)
目的:
设置Table,栏位自定,
写一SQL函数求出若干年前后的任意两人之间的关系,假定身份证号码不重复,当输入两身份证后就能得出他们的关系
下面是正文
Jdbc存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft® SQL Server™ 启动时自动运行的存储过程。 用户定义函数,它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。 与系统函数一样,用户定义函数可以从查询中唤醒调用。也可以像存储过程一样,通过 EXECUTE 语句执行。 总之: 自定义函数:有且只有一个返回值,就像普通的函数一样,可以直接在表达式中嵌入调用并可以随处调用。 存储过程:可以没有返回值,也可以有任意个输出参数,必须单独调用
存储过程很好吧,尤其是涉及到多表联合更新的问题,就效率易用两个方面来说就都NB的了。既然这么好的东西,你说说在实际的WEB application里面不用岂不是可惜了,话说到咱们的WEB APP中,要是NB的企业一般是不会用什么 structs hibernate spring jsf等等框架,但是不能说这些东西不优秀不好用,相反一些公司的一般项目用这些东西的优点自不必多说。但是现在流行的ssh也不是很好的支持存储过程,见网上也说hibernate 3.X支持存储过程,笨人没有用过,不敢妄加评论,方正2.X不行,有高人说spring支持,查了查看看,里面说到底也是用jdbc,而且还是先要从文件系统里面读取配置数据源的XML文件,解析出来相应的数据连接,我测试了一下,单次访问,速度都明显的需要等待,试想如果访问量大的话,速度效率自然不敢恭维。既然本身就是用jdbc,为何不直接生成一个专门处理存储过程的类,里面用jdbc去处理呢。而且就这个方法也有人用,感觉不是很多,笨人测试了一下,速度明显比那个提取XML文件的方法高,于是在没有找到更好办法时间,我决定暂时用这个笨方法:
下面我给出几个例子,以后好复习学习:
- create table bankMoney(
- Id varchar(5) primary key not null,
- userID varchar(20),
- sex varchar(2),
- userMoney int
- )
这个table 是随便搞的,意义混乱,不要当真,说明问题就行
第一种情况:没有输入返回记录集
- create proc selectNoParam
- as
- select * from bankMoney
- java code:
- Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bbs", "sa", "sa");
- CallableStatement cs = con.prepareCall("{call selectNoParam()}");
- ResultSet rs = cs.executeQuery();
- while(rs.next()){
- System.out.println(rs.getString("Id")+" " + rs.getString("userid")+" " + rs.getString("sex")+" " + rs.getString("userMoney"));
- }
第二种情况:
有输入参数,没有输出参数的例子。这里的delbankMoney(?),一个问号代表一个参数,包括输入参数和输出参数,
//从左到右index从1开始依次增大。一般来说在声明定义存储过程时间,后面一般放输出参数
--删除相应员工
- create proc delbankMoney(@paramId varchar(5))
- as
- delete from bankMoney where Id = @paramIdjava code:
- CallableStatement cs = con.prepareCall("{call delbankMoney(?)}");
- cs.setString(1, "001");
- cs.execute();
第三中情况:一个输入,一个输出,后面的问号代表输出,可以有多个输出,具体怎么设置要根据你在数据库中的声明顺序
- Proc code:
- create proc testOutPut(@paramId int,@paramSalary int output)
- as
- select @paramSalary = userMoney from bankMoney where Id = @paramId
- java code:
- CallableStatement cs = con.prepareCall("{call testOutPut(?,?)}");
- cs.setString(1, "001");
- cs.registerOutParameter(2, java.sql.Types.TINYINT);
- cs.executeUpdate();
- System.out.println("001号员工工资为:"+cs.getObject(2));
- cs.close();
- con.close();
Jdbc存储过程调用基本上就是这样了。
【编辑推荐】