5

第一次使用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())一起使用吗?

爪哇:

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

            callStmt.setString(1,"15105");
            callStmt.setString(2, "");
            callStmt.setBoolean(3, true);

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)

甲骨文改为:

 PROCEDURE GET_PLAN_DATA(
            NAME_N_IN IN VARCHAR2,
            TYPE_C_IN IN VARCHAR2 DEFAULT NULL,
            ONLY_RESTRICTIONS_IN IN INT DEFAULT 0)
4

2 回答 2

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值,所以它期待同样的事情。以前,oracle 也存在一个Boolean变量。但是正如您所说,在尝试了几件事之后,我只是将 Oracle 中的类型从 Boolean 更改为 Int,而 Java 代码仍然为“setBoolean(3, true)”,一切正常。,原因是,oracle 不再有布尔变量。为什么?阅读本文以深入讨论该问题。

3) 为了提高速度,我应该将 Oracle 类型 int 与 java setBoolean() 或其他组合(如 Oracle Varchar 和 setString())一起使用吗?

我会说varcharsetString()。原因,setString()方法其转换为varchar. 因此,与从到到的setBoolean()和相比,您可以节省时间。intBooleanBITint


编辑

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

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

下面是我们的客户编写的 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,

--------------- 更多参数....

在整合上述内容时,除了布尔 OUT 参数之外,一切都很好。我认为(如果错了,请纠正我)java(JDBC 类)中没有 SQL 数据类型来捕获
“ob_is_valid”、“ob_is_obgr_obgt_valid”参数。怎么可能去解决这个问题。一个想法是:我可以编写另一个 SP(比如 SP1),它将调用上述 SP 并将布尔类型转换为 CHAR,例如“Y”代表真,“N”代表假。最后我让应用程序调用新创建的 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;

从 jdbc 应用程序。

于 2012-05-29T15:02:40.143 回答
2

存储过程输入中不支持布尔值 这是 JDBC 驱动程序的已知限制

JDBC 驱动程序不支持将 BOOLEAN 参数传递给 PL/SQL 存储过程。

https://docs.oracle.com/cd/B28359_01/java.111/b31224/apxtblsh.htm#i1005380

于 2019-01-09T16:06:35.453 回答