存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验。
1.无输入和输出参数的存储过程,我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号
CREATE OR REPLACE Procedure cascadeoperation
As
Begin
Delete From teacher Where id=1;
Update studentdetail Set address='宁波市海曙区' Where studentid=10;
End;
{call cascadeoperation}
CREATE OR REPLACE Procedure queryTeacher(fid In Integer,Type In Varchar,Name Out Varchar)
As
Begin
If Type='1' then
Select Name Into Name From student Where id=fid;
Else if Type='2' Then
Select Name Into Name From teacher Where id=fid;
Else
Name:='错误';
End If;
End If;
End;
Declare
Name Varchar2(50);
Begin
queryteacher(3,'2',Name);
DBMS_OUTPUT.put_line(Name);
End;
/
看到结果了吧,下面使用mybatis来执行这个存储过程,下面是映射文件的写法
Map mm=new HashMap();
mm.put("fid", 3);
mm.put("type", 2);
m.queryTeacher(mm);
System.out.println(mm.get("name"));
下面是控制台输出的结果
3.还有一种存储过程,它可以返回一个游标就类似一个集合这种
CREATE OR REPLACE Procedure getTeacher(cur_arg out Sys_Refcursor)
As
begin
open cur_arg for Select * From teacher;
End;
这里的话Java代码就稍微复杂一些
Map map = new HashMap();
m.getAllTeacher(map);
Set> set = map.entrySet();
for (Iterator> it = set.iterator(); it
.hasNext();) {
Map.Entry entry = (Map.Entry) it
.next();
// System.out.println(entry.getKey() + "--->" +
// (Teacher)entry.getValue());
List t = (List) entry.getValue();
Iterator itera = t.iterator();
while (itera.hasNext()) {
Teacher tt = itera.next();
System.out.println(tt.getName() + "," + tt.getAddress());
}
}
到这里存储过程已经差不多了,研究了好久才弄出来,其他的用jdbc执行存储过程我随后会把文章添上来。