У нас есть много хранимых процедур и функций, которые мы вызываем в нашей БД, и настройка для каждого вызова в нашем слое доступа к данным действительно многословна с настройкой входных данных, регистрацией выходных данных и т. Д. Есть ли лучшее решение для генерации, возможно,CallableStatement динамически для любой хранимой процедуры или функции с любыми типами / количествами параметров и типом вывода?
У нас есть решение для домашнего приготовления, и оно уродливо ... полно if / else, fors и whiles ... очень трудно читать и поддерживать.Мы также попытались централизовать общий шаблонный код для аналогичных вызовов функций.IE Все те, которые принимают Long и возвращают логическое значение, все используют один и тот же централизованный метод с динамической Long и строкой хранимой процедуры.
Код из памяти, пожалуйста, не обращайте слишком много внимания на синтаксис, это вопрос дизайна больше всего.
//Client usage in Controller class
certAwarded = PackageName.isCertAwardedFor(personIDToCheck);
//In class that mimics the interface of the database packages
//There would be a method per public function
public static boolean isCertAwardedFor(Long personID){
return PackageUtils.isMet(personID, "{? = call PACKAGE.is_met(?)}");
}
//In Package scoped Utility class
//Attempt to centralize all single input param and return of boolean
//type of procedure calls.
static boolean isMet(Long personID, String proc){
boolean met = false;
try(AutoCloseableStatement stmt = new AutoCloseableStatement(proc)){
CallableStatement callableStmt = stmt.createStatement();
callableStmt.registerOutParameter(1, OracleTypes.VARCHAR2);
callableStmt.setLong(2, personID);
callableStmt.execute();
met = convertYNtoBool(callableStmt.getString(1));
}catch(SQLException ex){
Logger.log(ex);
}
return met;
}
///////////////////////////////////OR///////////////////////////////
//Client usage in Controller class
certAwarded = PackageName.isCertAwardedFor(personIDToCheck, CertPackageEnum);
//In class that mimics the interface of the database packages
//There would be a method per public function
public static boolean isCertAwardedFor(Long personID, PackageProc procCall){
return PackageUtils.call(personID, procCall.IS_CERT_AWARDED);
}
//In Package scoped Utility class
//Attempt to centralize all single input param and return of boolean
//type of procedure calls.
static boolean isMet(Long personID, String proc){
try(AutoCloseableStatement stmt = new AutoCloseableStatement(proc)){
CallableStatement callableStmt = stmt.createStatement();
LOTS OF CONDITIONS TO CHECK AND SET ALL POSSIBLE INPUTS AND OUTPUTS
}catch(SQLException ex){
Logger.log(ex);
}
return ?????
}