前台页面上不管分页选第几页,返回的结果都是相同的
为了避免这些问题,您可以尝试以下方法:
由于业务需要得通过存储过程返回结果集,方便现场实施进行自主调整sql语句条件,查到结果集需要重新进行组合,按照和前端约定的数据结构进行返回,此次调用oracle存储函数通过jdbctemplate的方式调用
Oracle存储过程是一种用于执行特定数据库功能的SQL语句集合。它们经过编译后存储在数据库系统中,可以通过指定存储过程名称并给出相应的参数来调用和执行。
Oracle存储过程通常包含以下三部分:
过程声明:定义存储过程的名称、参数和返回值等信息。 例如,以下代码定义了一个名为"get_employee_details"的存储过程,它接受一个参数"employee_id"并返回一个结果集:
sqlCREATE OR REPLACE PROCEDURE get_employee_details (
employee_id IN NUMBER,
employee_details OUT sys_refcursor
) AS
BEGIN
-- 执行查询操作
OPEN employee_details FOR
SELECT * FROM employees WHERE employee_id = employee_id;
END;
/
执行过程部分:包含具体的数据库操作和逻辑判断。 例如,以下代码展示了一个简单的存储过程,它接受两个参数"start_date"和"end_date",并返回一个结果集:
sqlCREATE OR REPLACE PROCEDURE get_sales_report (
start_date IN DATE,
end_date IN DATE,
sales_report OUT sys_refcursor
) AS
BEGIN
-- 执行查询操作
OPEN sales_report FOR
SELECT * FROM sales WHERE sale_date BETWEEN start_date AND end_date;
END;
/
存储过程异常:用于处理可能出现的异常情况,以保证存储过程的稳定性和可靠性。 例如,以下代码展示了一个带有异常处理的存储过程,它接受一个参数"employee_id",并返回一个结果集:
sqlCREATE OR REPLACE PROCEDURE get_employee_details (
employee_id IN NUMBER,
employee_details OUT sys_refcursor
) AS
BEGIN
-- 判断参数是否为空
IF employee_id IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Please provide an employee ID.');
END IF;
-- 执行查询操作
OPEN employee_details FOR
SELECT * FROM employees WHERE employee_id = employee_id;
EXCEPTION WHEN OTHERS THEN
ROLLBACK; -- 处理异常并回滚事务
END;
/
sql
create or replace procedure PRO_REC_HOMEPAGE_PANE(deptCode in varchar2,
startTime in date,
endTime in date,
list2 out sys_refcursor) is
begin
OPEN list2 FOR
select '出院人数' as CARD_NAME,
0 as UNDO_COUNT,
(SELECT COUNT(*) AS people_count
FROM pat_visit_v a
WHERE a.DISCHARGE_TIME IS NOT NULL
AND a.DISCHARGE_TIME >= startTime
AND a.DISCHARGE_TIME <= endTime
AND (deptCode IS NULL OR a.DEPT_DISCHARGE_FROM = deptCode)) as DO_COUNT
from dual
union all
select '病案提交' as CARD_NAME,
(select count(*) as people_count
from rec_mrhp_submit b, pat_visit_v t
where t.patient_id = b.PATIENT_ID(+)
and t.VISIT_NO = b.VISIT_ID(+)
and (b.mr_status is null or b.MR_STATUS = '0')
and t.DISCHARGE_TIME is not null
AND t.DISCHARGE_TIME >= startTime
AND t.DISCHARGE_TIME <= endTime
AND (deptCode IS NULL OR t.DEPT_DISCHARGE_FROM = deptCode)) as UNDO_COUNT,
(select count(*) as people_count
from rec_mrhp_submit b, pat_visit_v t
where t.patient_id = b.PATIENT_ID(+)
and t.VISIT_NO = b.VISIT_ID(+)
and b.mr_status in ('4', '5')
and t.DISCHARGE_TIME is not null
AND t.DISCHARGE_TIME >= startTime
AND t.DISCHARGE_TIME <= endTime
AND (deptCode IS NULL OR t.DEPT_DISCHARGE_FROM = deptCode)) as DO_COUNT
from dual;
end PRO_REC_HOMEPAGE_PANE;
由于业务需要,需要返回多个值,不能在程序里写死sql,所以就改成写函数,让现场可以自动配置
oracle函数和存储过程返回结果集是一件很麻烦的事情,其次就是不能使用同一个字段名union,如果设置成返回复杂对象或者游标类型,那么就不够动态,前端还是要不断因为现场调整函数而进行调整,所以我采用拼接字符串的方式,返回一个字符串,然后java根据字符串来中',',来进行分割成数组返回给前端,这个方式只能在函数中每个select查询都是查询一个结果的时候才能用,如果查询多个结果就不好用了
oracle 函数
sql
create or replace function get_important_mark(patientId in varchar2,
visitNo in varchar2)
RETURN VARCHAR2 IS
result_marks VARCHAR2(100); -- 修改为result_marks变量,并指定适当的长度
mark1 VARCHAR2(10);
mark2 VARCHAR2(10);
BEGIN
-- 第一个查询语句
SELECT CASE
WHEN SYSDATE - t.admission_date_time > 3 THEN
'三'
ELSE
''
END
INTO mark1
FROM system.abc t
WHERE t.patietn_id = patientId
AND t.visit_id = visitNo;
-- 将第一个标记赋值给result_marks变量
result_marks := mark1;
-- 第二个查询语句(修改条件)
SELECT CASE
WHEN SYSDATE - t.discharge_date_time > 3 THEN
'四'
ELSE
''
END
INTO mark2
FROM system.abc t
WHERE t.patient_id = patientId
AND t.visit_id = visitNo;
-- 将第二个标记添加到result_marks变量中(使用字符串连接操作符)
result_marks := result_marks || ',' || mark2;
-- 返回结果值
RETURN result_marks;
END get_important_mark;
需要前端传入语句,后端直接对语句进行执行操作,之前已经写过使用jdbc的方式执行,现在想用mabatis的方式执行
直接传入mapper接口层,使用@Select接口实现,或者传入mapper.xml中进行编写
javapublic interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
@Select("${nativeSql}")
Object nativeSql(@Param("nativeSql") String nativeSql);
}
使用一个自己的BaseMapper去继承MybatisPlus自己的BaseMapper,然后所有的Mapper去继承自己写的BaseMapper即可,那么所有的Mapper都能查询原生SQL了。可能会导致异常
使用SqlRunner的方式执行原生SQL,也是MybatisPlus源码的测试类中用的最多的方法。 当前模块的application.yml文件中增加开启SqlRunner的开关
ymlmybatis-plus:
global-config:
enable-sql-runner: true
代码
javaint count = SqlRunner.db().selectCount(countSql);
父级的orderNo属性修改后,需要同步更新多个子级的全部orderNo属性,子类的orderNo内容要和父级同步
sql
MERGE INTO rec_search_solution_field e1
USING (
SELECT field_id, order_no
FROM rec_search_solution_field
WHERE solution_id='2023062616531652c6e468-8a73-4934-9f7d-7c96102c249a'
AND order_no IS NOT NULL
) e2
ON (e1.field_id = e2.field_id)
WHEN MATCHED THEN
UPDATE SET e1.order_no = e2.order_no
WHERE e1.solution_id= '2023071916160381771c2e-d2f1-4289-a022-83d2a71ceddd';