我需要调用一个Oracle过程,其中一个IN参数与VARCHAR2和OUT参数作为BOOLEAN数据类型。
下面是我使用SimpleJDBCall的代码
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);
异常: CallableStatementCallback;SQL未分类的SQLExctive[{callPACKAGE_NAME.PROC_NAME(?, ?)}]; SQL状态[99999];错误代码[17004];无效列类型: 16;嵌套异常java.sql.SQLExctive:无效列类型: 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 ;
另外,我没有使用SimpleJDBCall,而是使用CallableStatement来处理这个问题。请参阅以下内容:
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官方文档中:
Oracle JDBC驱动程序不支持调用参数或返回PL/SQL记录、布尔值或具有非标量元素类型的表的值。[...] 作为PL/SQL记录、布尔或非标量表类型的变通方法,创建容器过程,将数据作为JDBC支持的类型处理。例如,要包装使用PL/SQL布尔值的存储过程,请创建一个存储过程,该存储过程从JDBC中获取字符或数字,并将其作为布尔值传递给原始过程,或者,对于输出参数,接受原始过程中的布尔参数,并将其作为字符或数字传递给JDBC。类似地,要包装使用PL/SQL记录的存储过程,请创建一个存储过程,该存储过程处理单个组件(如CHAR和NUMBER)中的记录,或结构化对象类型中的记录。
这正是您在回答中所做的,但我想添加文档作为参考。
我正在制作一个函数来返回布尔值,以了解元素是否存在,但我得到 我怎么才能得到唯一的真实或虚假响应,请帮助,我使用了if条件,但它显示了该响应…… 这是我调用的函数
问题内容: 由于如何在JSP页面中从数据库检索和显示图像,我找到了一种从 db / blob 检索图像的很好的解决方案? 但这是在每个图像请求上使用 JDBC连接的 解决方案。 我正在使用 Spring 3 注释和 Hibernate 3 。 我试图通过我的’imageService’做类似的事情,它通过 ImageServlet类中 的注释自动装配,但是我得到了 nullPointerExcep
我在Oracle 11g数据库中有一个存储过程,如f(a输入,b输入,c输出)。我想在批处理模式下从JDBC调用它,然后读取所有的OUT变量。 这可能吗?到目前为止我有这个 谢谢
问题内容: 我一直感到沮丧的是,Oracle PL / SQL支持数据类型,而Oracle SQL不支持。当您想将PL / SQL布尔返回值处理回日常SQL中时,这是一个很大的麻烦(下面的示例)。 甚至Ask-Tom网站都对这种不匹配感到不满,报告您应该将布尔列编码为固定值列,这在许多不同的级别上都是很糟糕的解决方案,我不知道从哪里开始批评它。实际上,此响应的唯一赎回质量是(据我最近发现的)事实,
上面是我的超级人类模型。请注意名为Hero的布尔变量。 上面是我用来通过servlet请求检索表单数据的控制器方法。一旦发现,注释部分将被替换为实际工作代码。 我只想知道是否有一种方法通过输入字段返回布尔值true或false,用户可以选择他们是英雄还是维利安,并在java中接收所述数据,我可以将其提交到SQL数据库中。
本文向大家介绍solr 布尔搜索,包括了solr 布尔搜索的使用技巧和注意事项,需要的朋友参考一下 示例 +firstname:john +surname:doe 匹配名字为john且姓氏为doe的文档。+前缀表示搜索词必须出现(AND)。 +firstname:john -surname:doe 匹配名字为john而名字不是doe的文档。-前缀表示不得出现搜索词(否)。 +firstname:j