从 java /spring boot 调用 PL/SQL 函数

问题描述 投票:0回答:1

我有一个 PL/SQL 函数,它接受 3 个参数并返回布尔值 以下是代码片段的部分

CREATE OR REPLACE FUNCTION IS_EMPLOYEE_EXISTS(
EMP_ID IN EMPLOYEE.EMP_ID%TYPES
EMP_NAME IN EMPLOYEE.EMP_NAME%TYPES
EMP_CATEGORY IN EMPLOYEE.EMP_CATEGORY%TYPES)
RETURN BOOLEAN
-- performing some operations based on the inputs given

现在我的任务是使用 spring jdbc 从我的 java 类中调用这个函数

我无法调用它,因为 Jdbc 驱动程序不支持 pl/sql 布尔类型

我调用这个函数的方法如下 我想用命名参数而不是序数参数来调用它

`

@Component
public MyClassDao extends AbstractDao(have the logic to get the DS){

final NamedParameterJdbcTemplete templete;

@Autowired
public MyClassDao(DataSource ds, NamedParameterJdbcTemplete templete){
super(dataSource);
this.templete = templete;
}

String queryString = "{ :"+ "RETURN_VALUE"+ " = call IS_EMPLOYEE_EXISTS ( :" + "EMP_ID" + ", :" +" EMP_NAME" + ", :" + "EMP_CATEGORY" +")}";

public Boolean callFunction(String empId,String empName, String empCat){

boolean result = false;

        try ( CallableStatement stmt = getDataSource().getConnection().prepareCall(IS_EMPLOYEE_EXISTS)) {

            stmt.registerOutParameter(RETURN_VALUE, Types.NUMERIC);
            stmt.setString(EMP_ID, empId); 
            stmt.setString(EMP_NAME, empName);
            stmt.setString(EMP_CATEGORY, empCat);

            stmt.execute();

            int returnValue = stmt.getInt(RETURN_VALUE);
            result = (returnValue == 1); // Interpret as boolean (1 for true, 0 for false)

        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        return result;
    }
}

我也尝试过其他一些方法,但也不起作用

`

java spring-boot plsql spring-data spring-jdbc
1个回答
0
投票

试试这个:

import org.springframework.jdbc.core.simple.SimpleJdbcCall;
// import ...

SimpleJdbcCallOperations employeeExistsCall = new SimpleJdbcCall(jdbcTemplate)
        .withFunctionName("IS_EMPLOYEE_EXISTS");

SqlParameterSource params = new MapSqlParameterSource()
        .addValue(EMP_ID, empId); 
        .addValue(EMP_NAME, empName);
        .addValue(EMP_CATEGORY, empCat);

Boolean employeeExists = employeeExistsCall.executeFunction(Boolean.class, params);

或者明确定义参数:

SimpleJdbcCallOperations employeeExistsCall = new SimpleJdbcCall(jdbcTemplate)
        .withFunctionName("IS_EMPLOYEE_EXISTS")
        .withoutProcedureColumnMetaDataAccess()
        .withNamedBinding()
        .withReturnValue()
        .declareParameters(
                new SqlOutParameter("return", Types.BOOLEAN),
                new SqlParameter("EMP_ID", Types.VARCHAR),
                new SqlParameter("EMP_NAME", Types.VARCHAR),
                new SqlParameter("EMP_CATEGORY", Types.VARCHAR)
        );

SqlParameterSource params = new MapSqlParameterSource()
        .addValue(EMP_ID, empId); 
        .addValue(EMP_NAME, empName);
        .addValue(EMP_CATEGORY, empCat);

Boolean employeeExists = employeeExistsCall.executeFunction(Boolean.class, params);
© www.soinside.com 2019 - 2024. All rights reserved.