Stored procedures JDBC-从Oracle过程检索布尔输出
我需要调用一个Oracle过程,其中一个IN参数为VARCHAR2,另一个OUT参数为BOOLEAN数据类型 下面是我使用SimpleJDBCall的代码Stored procedures JDBC-从Oracle过程检索布尔输出,stored-procedures,boolean,spring-jdbc,jdbctemplate,Stored Procedures,Boolean,Spring Jdbc,Jdbctemplate,我需要调用一个Oracle过程,其中一个IN参数为VARCHAR2,另一个OUT参数为BOOLEAN数据类型 下面是我使用SimpleJDBCall的代码 SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getTemplate()) .withCatalogName("package_name") .withProcedureName("proc_name") .withoutPr
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getTemplate())
.withCatalogName("package_name")
.withProcedureName("proc_name")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
new SqlParameter ("userName", Types.VARCHAR),
new SqlOutParameter("status", Types.BOOLEAN)
);
Map<String, Object> inParams = new HashMap<String, Object>();
inParams .put("userName", userInput);
Map<String, Object> outputValue= jdbcCall.execute(inParams);
SimpleJdbcCall jdbcCall=new SimpleJdbcCall(getTemplate())
.withCatalogName(“包装名称”)
.withProcedureName(“程序名称”)
.withoutProcedureRecolumnMetadataAccess()的
.申报参数(
新的SqlParameter(“userName”,Types.VARCHAR),
新的SqlOutParameter(“status”,Types.BOOLEAN)
);
Map inParams=new HashMap();
inParams.put(“用户名”,userInput);
Map outputValue=jdbcCall.execute(inParams);
异常:CallableStatementCallback;的未分类SQLException
SQL[{call PACKAGE_NAME.PROC_NAME(?,)}];SQL状态[99999];
错误代码[17004];无效列类型:16;嵌套异常是
java.sql.SQLException:无效的列类型:16
在做了一项研究之后,我发现“JDBC驱动程序不支持将布尔参数传递给PL/SQL存储过程”
有人建议用第二个PL/SQL过程包装PL/SQL过程。主要问题是我在db中的写访问权限受到限制,因为这是客户机数据。请帮我解决这个问题
我提到的一些链接
我通过编写一个包装器过程来处理实际过程的结果并将结果作为varchar数据类型发送回来,解决了这个问题。 如果你们中的任何人发现这是一个错误的方法,或者如果你有任何简单的方法来解决这个问题,请分享你的评论 以下是程序:
DECLARE
userName VARCHAR2(13);
status BOOLEAN;
result VARCHAR2(13);
BEGIN
userName := ?;
status := NULL;
package_name.proc_name ( userName, status);
BEGIN
IF status THEN result := 'Yes';
ELSIF NOT status THEN result := 'No';
ELSE result := 'NULL';
END IF;
END;
COMMIT;
? := result;
END ;
另外,我使用CallableStatement来处理这个问题,而不是SimpleJDBCall。请参阅下文:
try{
String wrapperProc= "DECLARE userName VARCHAR2(13); status BOOLEAN; result VARCHAR2(13); BEGIN userName := ?; status := NULL; "+
"package_name.proc_name ( userName, status ); BEGIN IF status THEN result := 'Yes'; ELSIF NOT status THEN " +
"result := 'No'; ELSE result := 'NULL'; END IF; END; COMMIT; ? := result;END ;";
CallableStatement proc_stmt= null;
proc_stmt = getTemplate().getDataSource().getConnection().prepareCall(wrapperProc);
proc_stmt.setString(1, "userName");
proc_stmt.registerOutParameter(2, Types.VARCHAR);
proc_stmt.execute();
System.out.println("Final Result : "+proc_stmt.getString(2));
} catch(SQLException e){
System.out.println("SQL Exception : "+e.getMessage());
e.printStackTrace();
} catch (Exception e) {
System.out.println("Exception : "+e.getMessage());
e.printStackTrace();
}
~Suriya来自官方甲骨文:
Oracle JDBC驱动程序支持调用是不可行的
PL/SQL记录、布尔值或表的参数或返回值
使用非标量元素类型。[…]作为PL/SQL记录的变通方法,
布尔或非标量表类型创建
将数据作为JDBC支持的类型处理。例如,包装
使用PL/SQL布尔值的存储过程,创建一个存储过程
从JDBC获取一个字符或数字并将其传递给
原始过程为布尔值,或者,对于输出参数,接受
原始过程中的布尔参数,并将其作为字符传递
或JDBC的编号。类似地,要包装使用
PL/SQL记录,创建一个存储过程,该过程在其
单个组件,如CHAR和NUMBER,或在结构化
对象类型
这正是您在回答中所做的,但我想添加文档作为参考。此文档适用于Oracle 11。相应的Oracle 12文档有一个“注意事项和限制”部分,该部分与此类似,只是不包括此部分!那么,在甲骨文12下有可能吗?另请参见,此文档()将布尔列为受支持的PL/SQL类型,但列在标量*字符*类型下,这很奇怪