我有一个 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;
}
}
我也尝试过其他一些方法,但也不起作用
`
试试这个:
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);