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

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

我需要调用一个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);
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类型,但列在标量*字符*类型下,这很奇怪