You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot中导入并使用Oracle数据库包(含调用示例)

在Spring Boot中调用Oracle数据库包的实现方法

一、针对cus.sMB_PACKAGE.EABAL的具体实现

1. 先配置Oracle数据库连接

确保Spring Boot的application.properties(或yaml)里填对Oracle数据源信息:

spring.datasource.url=jdbc:oracle:thin:@//你的Oracle地址:端口/服务名
spring.datasource.username=你的账号
spring.datasource.password=你的密码
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

2. 两种调用方式任选

方式一:用JdbcTemplate(轻量直接)

直接通过JdbcTemplate调用包方法,注意Oracle的调用语法:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.sql.Date;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Component
public class SmbPackageService {
    private final JdbcTemplate jdbcTemplate;

    // 构造注入JdbcTemplate
    public SmbPackageService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void invokeEabal(Long newAseid, String inputDate) {
        // 把原SQL里的日期计算逻辑移到Java层处理,避免SQL拼接风险
        LocalDate targetDate = LocalDate.parse(inputDate, DateTimeFormatter.ofPattern("dd-MM-yyyy")).minusDays(1);
        Date sqlDate = Date.valueOf(targetDate);

        // 构造Oracle包方法调用语句
        String sql = "{ call cus.sMB_PACKAGE.EABAL(?, ?) }";
        jdbcTemplate.update(sql, newAseid, sqlDate);
    }
}

如果非要在SQL里处理日期,也可以这么写SQL:

"{ call cus.sMB_PACKAGE.EABAL(?, to_date(?,'dd-mm-yyyy') - 1) }"

调用时直接传入newAseid和原始日期字符串就行。

方式二:用MyBatis(适合复杂场景)

如果项目用MyBatis,直接在Mapper里定义调用方法即可:

  • Mapper接口:
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

public interface SmbPackageMapper {
    @Update("{ call cus.sMB_PACKAGE.EABAL(#{newAseid}, to_date(#{dateStr},'dd-mm-yyyy') - 1) }")
    void callEabal(@Param("newAseid") Long newAseid, @Param("dateStr") String dateStr);
}

或者用XML映射文件(适合更复杂的参数/结果映射):

<mapper namespace="com.your.project.mapper.SmbPackageMapper">
    <update id="callEabal">
        { call cus.sMB_PACKAGE.EABAL(#{newAseid}, to_date(#{dateStr},'dd-mm-yyyy') - 1) }
    </update>
</mapper>

之后在Service里注入Mapper调用就行。


二、Spring应用调用Oracle数据库包的通用方法

1. 核心逻辑

Oracle的包方法(存储过程/函数)就是数据库端的可执行代码,Spring通过JDBC或ORM框架发送PL/SQL调用语句,语法规则:

  • 调用无返回值的存储过程:{ call 模式名.包名.方法名(参数列表) }
  • 调用有返回值的函数:{ ? = call 模式名.包名.方法名(参数列表) }

2. 通用步骤

  • 步骤1:配置依赖与数据源
    Spring Boot项目先加依赖:

    <!-- Maven依赖 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 用JdbcTemplate加这个,用MyBatis就加spring-boot-starter-mybatis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>
    

    然后配置好前面提到的Oracle数据源。

  • 步骤2:选择调用方式

    • JdbcTemplate:适合简单场景,轻量无额外配置。
      • 无返回值用jdbcTemplate.update(),有返回值用jdbcTemplate.queryForObject(),涉及输出参数的话要注册参数类型:
        public String callPackageFunction(Long input) {
            String sql = "{ ? = call cus.sMB_PACKAGE.GET_RESULT(?) }";
            return jdbcTemplate.queryForObject(sql, new Object[]{input}, new int[]{Types.VARCHAR, Types.NUMERIC}, String.class);
        }
        
    • MyBatis:适合复杂参数/结果映射,比如涉及Oracle自定义对象、集合的场景,通过注解或XML配置更灵活。
    • JPA/Hibernate:如果项目用JPA,可以用@NamedStoredProcedureQuery映射包方法,但配置相对繁琐,适合已有JPA体系的项目。
  • 步骤3:参数处理注意点

    • 日期参数:优先在Java层处理为java.sql.Date或LocalDate后传入,避免SQL拼接;非要在SQL里转换的话,注意格式匹配。
    • 输出参数:JdbcTemplate需要用SqlOutParameter注册,MyBatis可以直接在参数里指定mode=OUT。
    • 自定义类型:比如Oracle的OBJECT、TABLE,JdbcTemplate要写自定义SqlTypeValue,MyBatis可以自定义TypeHandler处理。

内容的提问来源于stack exchange,提问作者Samith Pathirana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:46