存储函数 - 发送/接收布尔值 - BD
Posted
技术标签:
【中文标题】存储函数 - 发送/接收布尔值 - BD【英文标题】:Stored Function - Sending/Receiving Boolean - BD 【发布时间】:2014-05-02 15:54:09 【问题描述】:找到了解决方案,见下文*
我正在尝试通过 SimpleJdbcCall(使用 java + jpa)执行存储的函数,但我无法执行,它显示:
[Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException:
CallableStatementCallback; uncategorized SQLException for SQL [? = call PK_BACKOFFICE.SET_PROFESSIONAL(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)];
SQL state [null]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type] with root cause
java.sql.SQLException: Invalid column type
这是我的代码:
dataSource = this.getDataSource();
SimpleJdbcCall caller = new SimpleJdbcCall(dataSource)
.withCatalogName("pk_backoffice_api_ui")
.withFunctionName("set_professional_main")
.declareParameters(
new SqlOutParameter("result",OracleTypes.BOOLEAN),
new SqlParameter("i_id_institution",
OracleTypes.NUMERIC),
new SqlParameter("i_id_prof", OracleTypes.NUMERIC),
new SqlParameter("i_first_name", OracleTypes.VARCHAR),
new SqlParameter("i_nick_name", OracleTypes.VARCHAR),
new SqlParameter("i_gender", OracleTypes.VARCHAR),
new SqlParameter("i_id_category", OracleTypes.NUMERIC),
new SqlParameter("i_id_lang", OracleTypes.NUMERIC),
new SqlParameter("i_flg_state", OracleTypes.VARCHAR),
new SqlParameter("i_commit_at_end", OracleTypes.BOOLEAN),
new SqlOutParameter("o_id_prof", OracleTypes.INTEGER),
new SqlOutParameter("o_error", OracleTypes.STRUCT, "T_ERROR_OUT"));
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("i_id_institution", 2790)
.addValue("i_id_prof", 7020000363724L)
.addValue("i_first_name", "teste")
.addValue("i_nick_name", "nicknameteste")
.addValue("i_gender", "f").addValue("i_id_category", 20)
.addValue("i_id_lang", 1).addValue("i_flg_state", "A")
.addValue("i_commit_at_end", true);
Integer res = caller.executeFunction(Integer.class, params);
Map out = caller.execute(params);
int idprof = (int) out.get("o_id_prof"); //getting out parameter?
// para obter o erro - caso haja
// (com.alert.core.plsql.types.TErrorOutType)__sJT_st.getORAData(35,com.alert.core.plsql.types.TErrorOutType.getORADataFactory());
System.out.println(res);
return res;
我意识到问题是向函数发送/接收布尔值..我还发现这是 jdbc 驱动程序的问题... BD 中没有编辑类型的选项,所以我真的需要找到一种发送/接收布尔值的方法。
..有什么建议吗?
【问题讨论】:
确保您设置的参数的类型(浮点数、字符等)与表中列的类型匹配。 我做到了,它确实匹配..所以我真的迷路了.. 我编辑了我的问题,我意识到问题是发送布尔类型..仍然我不知道如何解决它。 【参考方案1】:解决方案是在函数调用中处理布尔值:
这意味着发送值而不是 ?/variable 并在调用中处理返回(也是布尔值)*
@Resource(name = "myJdbcTemplate")
public JdbcTemplate simpleJdbc;
private Connection getConnection() throws SQLException
return simpleJdbc.getDataSource().getConnection();
@Override
public boolean setProfessionalBD(Professional professional,
Category category, BigDecimal id_language, BigDecimal id_institution)
throws SQLException
CallableStatement proc_strm = null;
proc_strm = getConnection().prepareCall(
"BEGIN ? := "
+ " CASE PK_BACKOFFICE.SET_PROFESSIONAL"
+ " (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,TRUE,?,?)"
+ " WHEN true " + " THEN 1 " + " ELSE 0 "
+ " END; " + " END;");
proc_strm.registerOutParameter(1, Types.INTEGER);
proc_strm.setBigDecimal(2, id_language);
proc_strm.setBigDecimal(3, id_institution);
(...)
proc_strm.execute();
【讨论】:
以上是关于存储函数 - 发送/接收布尔值 - BD的主要内容,如果未能解决你的问题,请参考以下文章