Oracle数据存储过程

  • Post author:
  • Post category:其他


最近需要用到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都连不上。



版权声明:本文为weixin_44170566原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。