Вызов хранимой функции в базе Oracle из бина
Посоны меня поставили на место (не совсем так но!!!)
В общем коммитов в хранимых процедурах и функциях в нашем проекте быть не должно. Коммит выполнять командой
ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl").getTransaction().commit();
Собственно пример
Имеем хранимую функцию.
Обращаю внимание, что текст функции не в {}.
Я не обратил, минут 20 не понимал, что не так.
CREATE OR REPLACE PACKAGE user_tasks is
FUNCTION is_current_pass_correct(
username IN sec_users.login%TYPE,
current_password IN sec_users.password%TYPE) RETURN NUMBER;
end user_tasks;
CREATE OR REPLACE PACKAGE BODY user_tasks is
FUNCTION is_current_pass_correct(
username IN sec_users.login%TYPE,
current_password IN sec_users.password%TYPE) return NUMBER IS
password_count NUMBER;
BEGIN
select count(*) into password_count from sec_users se where
se.login = username
and se.password = current_password;
return password_count;
EXCEPTION
WHEN OTHERS THEN
return 0;
END current_pass_check;
END is_current_pass_correct;
UPD:
Вещи вроде begin ?:= user_tasks.is_current_pass_correct(?,?); end;, выношу в отедьный файл с константами!
***
import java.sql.Types;
import java.sql.SQLException;
***
private Boolean isInputPasswordCorrect(String userName, String currentPassword){
CallableStatement st = null;
String function_execute = "begin ?:= user_tasks.is_current_pass_correct(?,?); end;";
try {
st = DBUtils.getDBTransaction().createCallableStatement(function_execute, 1);
st.registerOutParameter(1, Types.INTEGER);
st.setString(2, userName);
st.setString(3, currentPassword);
st.execute();
Integer out = st.getInt(1);
if(out.equals(1)){
return true;
} else {
return false;
}
} catch (SQLException ex) {
return false;
} finally {
try {
if (st != null) {
st.close();
}
} catch (Exception ex) {
return false;
}
}
}
====================
UPD. Печатаю без проверки на реальном сервере!!!
UPD: Может так лучше:
package orj.javadev.project.constants.oracle;
public class CONSTANTS_ORACLE_STORED_FUNCTIONS {
public static final String MY_STORED_FUNCTION_TXT = "begin ?:= sys.diutil.bool_to_int(my_package.my_stored_function(?,?)); end;";
} // The End of Class;
Обращаю внимание на:
//result - Boolean parameters are translated from/to integers: 0/1/null <--> false/true/null
public String myMethod() {
***
CallableStatement st = null;
try {
st = DBUtils.getDBTransaction().createCallableStatement(CONSTANTS_ORACLE_STORED_FUNCTIONS.MY_STORED_FUNCTION_TXT, 1);
// То, что будет возвращено
st.registerOutParameter(1, Types.NUMERIC); //result - Boolean parameters are translated from/to integers: 0/1/null <--> false/true/null
st.setLong(2, osid);
st.registerOutParameter(3, Types.VARCHAR);
st.execute();
} catch (SQLException ex) {
throw new JboException(ex);
} finally {
try {
if (st != null) {
st.close();
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
}
return null;
}
Хранимая функция возвращает true или false.
FUNCTION my_stored_function(param1 IN NUMBER, param2 OUT VARCHAR2)
RETURN BOOLEAN IS
L_program VARCHAR2(11) := 'DELETE_RULE';
BEGIN
***
return TRUE;
EXCEPTION
WHEN OTHERS THEN
o_err_msg := SQL_LIB.CREATE_MSG('PACKAGE_ERROR',
SQLERRM,
LP_package || L_program,
TO_CHAR(SQLCODE));
return FALSE;
END my_stored_function;