如何构造布尔值并使用java/oracle存储过程访问它们

JWi*_*ley 5 java sql database oracle jdbc

第一次使用Oracle,通常使用SQLServer,并遇到了一个奇怪的问题.我正在用这个问题撕掉我的头发,并尝试随机的东西,一个正好工作.

所以最初,我只有两个参数,一切正常.然后,我希望添加一个布尔值,以允许我的存储过程中的多个路径.我在我的数据库环境中测试它,没有错误,我收到了我期望的数据.然后我在我的java代码中添加几行来提取这些数据,然后突然出现" wrong number or types of parameters"错误.

在尝试了几件事之后,我只需将Oracle中的类型从Boolean更改为Int,将java代码保留为" setBoolean(3, true)",一切正常.

所以我的问题是:

1)我在java端使用这个setBoolean()发送了什么,Oracle得到了什么?

2)它之前是什么样的类型" Boolean,为什么这与它不兼容setBoolean()?"

3)在提高速度时,我应该使用Oracle类型int和java setBoolean(),还是其他组合,如Oracle Varchar和setString()?

Java的:

String jobquery =   "{call PKG_TEST.GET_PLAN_DATA(?,?,?)}";  
            CallableStatement callStmt = con.prepareCall(jobquery);

            callStmt.setString(1,"15105");
            callStmt.setString(2, "");
            callStmt.setBoolean(3, true);
Run Code Online (Sandbox Code Playgroud)

Oracle SP(上一篇):

PROCEDURE GET_PLAN_DATA(
        NAME_N_IN IN VARCHAR2,
        TYPE_C_IN IN VARCHAR2 DEFAULT NULL,
        ONLY_RESTRICTIONS_IN IN BOOLEAN DEFAULT FALSE)
Run Code Online (Sandbox Code Playgroud)

Oracle改为:

 PROCEDURE GET_PLAN_DATA(
            NAME_N_IN IN VARCHAR2,
            TYPE_C_IN IN VARCHAR2 DEFAULT NULL,
            ONLY_RESTRICTIONS_IN IN INT DEFAULT 0)
Run Code Online (Sandbox Code Playgroud)

Kaz*_*ara 2

1)我在java端用这个setBoolean()发送了什么,Oracle得到了什么?

来自 Java文档

Sets the designated parameter to the given Java boolean value. The driver converts this to an SQL BIT value when it sends it to the database.

所以这个Boolean值就转换成了一个BIT值。

2)当它的类型为 时,它之前期待什么Boolean,为什么它与 setBoolean() 不兼容?”

如前所述,它将其转换为一个BIT值,因此它期待同样的事情。Boolean之前oracle也有一个变量。但正如你所说,在尝试了几件事之后,我只是将 Oracle 中的类型从 Boolean 更改为 Int,让 java 代码仍然为“setBoolean(3, true)”,一切正常。原因是,oracle 不再有布尔变量了。为什么?阅读本文以深入讨论该问题。

3) 当追求速度时,我应该使用 Oracle 类型 int 与 java setBoolean() 或其他一些组合,例如 Oracle Varchar 和 setString() 吗?

我会说varcharsetString()。原因,setString()方法将其转换varchar. 因此,与从 到 到 相比setBoolean()intBoolean可以BIT节省时间int


编辑

只是从上述链接之一复制粘贴的内容以进一步澄清问题:

嗨汤姆,我有一个关于布尔数据类型的问题。

下面是我们的客户编写的 SP,我们需要将其与我们的应用程序集成。

PROCEDURE sp_xxxx_map (
                ic_opt_number       IN  VARCHAR2,
                in_cast_number    IN  NUMBER,
                in_tyre_amount          IN  NUMBER,
                ob_is_valid             OUT BOOLEAN,
                ob_is_obgr_obgt_valid   OUT BOOLEAN,
Run Code Online (Sandbox Code Playgroud)

--------------- 还有几个参数......

在集成上述内容时,除了布尔 OUT 参数之外,一切都很好。我认为(如果错了请纠正我)java(JDBC类)中没有SQL数据类型来捕获
“ob_is_valid”,“ob_is_obgr_obgt_valid”参数。如何解决这个问题。一个想法是:我可以编写另一个 SP(例如 SP1),它将调用上面的 SP 并将布尔类型转换为 CHAR,例如“Y”表示 true,“N”表示 false。最后我让应用程序调用新创建的SP1。

后续 2003 年 2 月 5 日 - 上午 9 点 中部时区:

只需准备并执行:

declare
   b1 boolean;
   b2 boolean;
   n1 number := 0;
   n2 number := 0; 
begin
   sp_xxxx_map( ?, ?, ?, b1, b2 );
   if (b1) then n1 := 1; end if;
   if (b2) then n2 := 1; end if;
   ? := n1;
   ? := n2;
end;
Run Code Online (Sandbox Code Playgroud)

来自 jdbc 应用程序。