当前位置: 首页 > 知识库问答 >
问题:

JDBC-从Oracle过程中检索布尔输出

须景辉
2023-03-14

我需要调用一个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中写入访问,因为这是客户端数据。请帮助我解决这个问题。

我提到的一些链接

  1. https://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/tips3.htm
  2. https://community.oracle.com/thread/2139408?tstart=0
  3. https://community.oracle.com/thread/887712?tstart=0
  4. https://community.oracle.com/thread/975159?tstart=0
  5. 存储函数-发送/接收布尔值-BD
  6. http://docs.oracle.com/cd/B28359_01/java.111/b31224/apxtblsh.htm#i1005380

共有2个答案

牟正真
2023-03-14

我通过编写一个包装过程来处理实际过程的结果,并将结果作为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

孟哲
2023-03-14

从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