Este artículo clasifica principalmente operaciones como funciones de llamada y procedimientos almacenados en la base de datos de Oracle en el marco mybatis. Y el uso del marco SSM para conectarse a la base de datos de Oracle. La lógica empresarial es solo para referencia de prueba.
1. Cree tablas, secuencias, procedimientos almacenados y funciones de valor de retorno en el lado de la base de datos de Oracle
1 La estructura de la tabla es la siguiente:
<!--1、试题表-->
create table question(
qid number(4,0) primary key,--试题ID
que varchar2(50) not null, --问题
answer varchar2(2) not null,--标准答案
score number(2,0) not null --这道题的分数
)
<!--2、试卷详情表-->
create table paper(
pid varchar2(20) not null,--试卷ID
qid number(4,0) not null, --对应的试题ID
useran varchar2(2) not null --用户选择的答案
)
2 Cree una secuencia como una operación de adición cuando se use como una columna de incremento automático
create sequence seq_stu
start with 1
increment by 1
cache 10
3 Escriba un procedimiento almacenado para agregar datos
¡Esto solo se usa como ejercicio y no tiene ningún significado práctico!
create or replace procedure add_procedure(
stuname varchar2, --用户名
stuage number, --年龄
address varchar2 --家庭住址
)
is
begin
begin
insert into student (stuno,stuname,stuage,address) values
(seq_stu.nextval,stuname,stuage,address); --这里使用序列做自增id
end;
end add_procedure;
4 Escribe una función para calcular la puntuación total de una determinada prueba.
Pase el número de la prueba y calcule la puntuación total de esta prueba.
--利用游标计算试卷总分数,返回给程序
create or replace function que_fun(
input_pid varchar2 --传入试卷ID
)
return number --返回试卷总分
is
begin
declare
cursor que_cursor is
select pid,paper.qid as qid2,useran,question.qid as qid1,answer,score
from paper inner join question
on question.qid=paper.qid
where pid=input_pid;
querow que_cursor%rowtype;
return_num number(2,0):=0; --声明返回值
begin
for querow in que_cursor loop
if querow.useran = querow.answer then
return_num:=return_num+querow.score;
end if;
end loop;
return return_num;
end;
end que_fun;
2. Utilice la secuencia, el procedimiento almacenado y la función de llamada para obtener el valor de retorno en el archivo mapper.xml en MyBatis.
<mapper namespace="com.dao.StuDao">
<!--1、利用存储过程做数据添加操作-->
<select id="insertStudent" parameterType="Student" statementType="CALLABLE">
{call add_procedure( #{stuName,mode=IN,jdbcType=VARCHAR}, #{stuAge,mode=IN,jdbcType=DOUBLE},
#{address,mode=IN,jdbcType=VARCHAR})}
</select>
<!--2、利用序列做自增列,添加操作-->
<insert id="insertStu" parameterType="Student">
insert into student (stuNo,stuname,stuage,address) values
<!--seq_stu.nextval表示名叫seq_stu这个序列的下一个值-->
(seq_stu.nextval,#{stuName},#{stuAge},#{address})
</insert>
<!--3、调用函数,传入试卷编号,获取返回值(总分数)-->
<select id="getAllScore" statementType="CALLABLE" parameterType="java.util.Map">
{#{callback,mode=OUT,jdbcType=INTEGER} =call que_fun(#{inputPid,mode=IN,jdbcType=VARCHAR})}
<!--callback用来接收函数返回值、inputPid表示传入函数中的参数、二者均通过map集合的形式传入到预编译好的sql中,详见service中的调用-->
</select>
</mapper>
- mode = IN significa que es un parámetro pasado en una función o un procedimiento almacenado, y debe estar en mayúscula;
- mode = OUT significa que el valor de retorno de la función, o el parámetro que significa el valor de retorno en el procedimiento almacenado, debe estar en mayúscula;
- Para llamar a funciones y procedimientos almacenados, use statementType = 'CALLABLE';
- Al llamar a la función para obtener el valor de retorno pasado en la colección Map <String, Object>, las claves de la colección representan respectivamente los parámetros pasados a la función y el valor de retorno de la función.
Tres, interfaz DAO y servicio de llamada
- Preparación de la interfaz dao
public interface StuDao {
//1、利用存储过程添加数据
public Integer insertStudent(Student student);
//2、常规添加数据,使用序列做自增列
public Integer insertStu(Student student);
//3、调用函数,传入试卷编号计算这张试卷的总分数
public void getAllScore(Map<String,Object> map);
}
- llamada de capa de servicio
Llamar a una función con un valor de retorno usa una colección de mapas para pasar parámetros
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StuDao stuDao;
public Integer addStu(Student student) {
return stuDao.insertStudent(student);
}
public Integer addStu2(Student student) {
return stuDao.insertStu(student);
}
public Integer getAllScore(String inputPid) {
Map<String,Object> map=new HashMap<String, Object>();
map.put("inputPid",inputPid);
map.put("callback", 0);
//将集合传入dao层
stuDao.getAllScore(map);
//调用函数成功,从map中获取结果
Integer callback=(Integer) map.get("callback");
return callback;
}
}
Cuarto, la configuración relevante de SSM para conectarse a la base de datos de Oracle
- dependencia de jar
<!--添加oracle依赖-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0-atlassian-hosted</version>
</dependency>
- El archivo de configuración jdbc.properties para conectarse a la base de datos de Oracle
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username=liugang
jdbc.password=root
maxWait=5000
initialSize=2
maxActive=6
minIdle=2
SQL común y PL / SQL relacionado de la base de datos Oracle:
https://blog.csdn.net/weixin_49702090/article/details/109373379