最近需要用到Oracle数据存储,去学了一下,这里简单记录一下,至于Oracle存储过程是怎样写的,我i这里就写出来了,
先创建一个表:
– Create table
create table EMP
( id INTEGER not null,
name VARCHAR2(20),
job VARCHAR2(20),
department VARCHAR2(20),
salary NUMBER,
comm NUMBER
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
然后写一个简单的存储过程:
create or replace procedure queryempinfo(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2,
pdept out varchar2,
pcomm out number)
as
begin
select name,salary,job,department,comm into pename,psal,pjob,pdept,pcomm from emp where id = eno;
end;
意思就是给一个eno去查询出所有字段,这里先用EntityManager调用,后面再用Mybatis,
项目就用一个简单的springboot项目就行了,jar包要有oracle的,这里用
com.oracle
ojdbc7
12.1.0.2
这个jar包maven是下不下来的,得去官网下载,然后cmd到jar包所在目录
执行:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar -Dfile=ojdbc7.jar
这样才可以,配置application.yml:
server:
port: 8088
spring:
datasource:
driver-class-name: oracle.jdbc.OracleDriver
password: oracle
username: ls
url: jdbc:oracle:thin:@192.168.117.128:1521:xe
database: oracle
mybatis:
mapperLocations: classpath:mapper/
.xml
logging:
level:
com.ls.
: debug
再启动类上加扫描包:@MapperScan(“com.*”)
然后直接写个Service测试
@Service
public class TestService {
@Autowired
private EntityManager entityManager;
public Emp findAll(){
Emp emp = new Emp();
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery(“queryempinfo”);
query.setParameter(“eno”,1);
String pename = (String)query.getOutputParameterValue(“pename”);
String pjob = (String)query.getOutputParameterValue(“pjob”);
String pdept = (String)query.getOutputParameterValue(“pdept”);
Double psal = (Double)query.getOutputParameterValue(“psal”);
Double pcomm = (Double)query.getOutputParameterValue(“pcomm”);
emp.setName(pename);
emp.setDepartment(pdept);
emp.setJob(pjob);
emp.setComm(pcomm);
emp.setSalary(psal);
query.execute();
return emp;
}
}
=========
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestServiceTest {
@Autowired
private TestService testService;
@Test
public void te(){
Emp all = testService.findAll();
System.out.println(all);
}
}
代码里写死了参数,所以只有一条数据
这样看来,输出得参数太多,太麻烦,可以用一个游标来接收,这里用mybatis
调用,先看存储过程,这里得emps表就是emp表,只是我复制了一下
create or replace procedure proc_demo4(
in_departement in varchar2,
out_result out sys_refcursor–动态cersor
–与静态cuesor不一样的是动态cursor需要创建时后面紧接着查询语句
)
as
begin
open out_result for
select e.name,e.salary from emps e where e.department = in_departement;
end;
=========
Mapper接口:
public interface EmpDao {
public List findSalary(Map<String,Object> map);
}
这里说个事,参数最好用map来接收,之前调试的时候总是出现各种问题;
======
mapper.xml中
{call proc_demo4(#{in_departement,mode=IN,jdbcType=VARCHAR},#{result,mode=OUT, jdbcType=CURSOR,javaType=ResultSet,resultMap=resultMap3})}
===============
这里说一下,resultMap中的type 可以是type ="java.util.HashMap",但是call proc_demo4(#{in_departement,mode=IN,jdbcType=VARCHAR}中的in_departement必须和存储过程中的一致,不然会查不到结果,result,mode=OUT,这里是把结果封装到map的result中,后面可以直接取出来。
====
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmpDaoTest {
@Resource
private EmpDao empDao;
@Test
public void test2(){
Map<String, Object> map = new HashMap<>();
map.put(“in_departement”,“财务部”);
empDao.findSalary(map);
List result = (List) map.get(“result”);
System.out.println(result);
}
这里再map中传入参数,并返回结果放到了map中,这就是上面说的,参数最好用一个map。
结果:
到这里就结束了,因为用的虚拟机中docker搭建的Oracle数据库,本机没有安装,用plsql develop连接的时候折腾了很久,想说一下的就是plsql develop的版本最好和数据库一样,或者低,不然用navicat能连上你用plsql develop都连不上。