Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构造布尔值并使用java/oracle存储过程访问布尔值_Java_Sql_Oracle_Jdbc_Database - Fatal编程技术网

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

如何构造布尔值并使用java/oracle存储过程访问布尔值,java,sql,oracle,jdbc,database,Java,Sql,Oracle,Jdbc,Database,第一次使用Oracle时,通常使用SQLServer,遇到了一个奇怪的问题。 这个问题让我毛骨悚然,我尝试了一些随机的事情,其中一个碰巧奏效 所以最初,我只有两个参数,一切都很好。然后,我希望添加一个布尔值,以便在存储的进程中允许多个路径。我在我的db环境中进行了测试,没有错误,我得到了预期的数据。然后我在java代码中添加了几行代码来提取这些数据,突然我得到了“错误的参数数量或类型””错误 在尝试了几件事情之后,我简单地将Oracle中的类型从Boolean更改为Int,使java代码仍然为“

第一次使用Oracle时,通常使用SQLServer,遇到了一个奇怪的问题。 这个问题让我毛骨悚然,我尝试了一些随机的事情,其中一个碰巧奏效

所以最初,我只有两个参数,一切都很好。然后,我希望添加一个布尔值,以便在存储的进程中允许多个路径。我在我的db环境中进行了测试,没有错误,我得到了预期的数据。然后我在java代码中添加了几行代码来提取这些数据,突然我得到了“
错误的参数数量或类型”
”错误

在尝试了几件事情之后,我简单地将Oracle中的类型从Boolean更改为Int,使java代码仍然为“
setBoolean(3,true)
”并且一切正常

因此,我的问题是:

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

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

3) 在追求速度时,我应该将Oracle type 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);
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)
Oracle SP(先前版本):

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

            callStmt.setString(1,"15105");
            callStmt.setString(2, "");
            callStmt.setBoolean(3, true);
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)
Oracle更改为:

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

            callStmt.setString(1,"15105");
            callStmt.setString(2, "");
            callStmt.setBoolean(3, true);
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)
1) 这个setBoolean()在java端发送了什么,Oracle得到了什么

从Java:

将指定参数设置为给定的Java布尔值。驱动程序将其发送到数据库时将其转换为SQL位值。

因此,
布尔值
转换为

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

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

3) 在追求速度时,我应该将Oracle type int与java setBoolean()结合使用,还是将Oracle Varchar和setString()结合使用

我会说
varchar
setString()
。原因是,
setString()
方法将其转换为
varchar
。因此,与
setBoolean()
int
相比,您可以节省时间,从
Boolean
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,
---------------没有更多的参数

在集成上述参数时,除了boolean OUT参数外,其他一切都很好。 我认为(如果我错了,请纠正我)java(JDBC类)中没有SQL数据类型来捕获
“ob_是有效的”、“ob_是有效的”参数。 我们可以如何处理这个问题。 一个想法是: 我是否可以编写另一个SP(比如SP1),它将调用上述SP并将布尔类型转换为 像“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应用程序

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

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


您可能想阅读以下内容:我对您对#2的回答感到困惑:“如前所述,它将其转换为位值,因此它期望的是相同的东西。”如果驱动程序将其转换为SQL位值,Oracle布尔值期望的是什么?是/否或“真”/“假”?更详细地说,我可以在callStmt.set中发送什么来保持Oracle变量为布尔值,并且它仍然有效?@KazekageGaara-Oracle有一个布尔数据类型,但仅用于PLSQL,而不用于SQL@A.B.Cade这些问题是针对SQL的,所以答案也是基于同样的原因。@JWiley-Oracle不支持布尔值,当您关心SQL时。您将不得不放弃使用布尔作为oracle变量。因此,当我在布尔默认值FALSE中说ONLY_RESTRICTIONS_时,它正在创建一个自定义变量?我可以在本地执行此sp,没有任何问题,并且它允许我取消选中/选中它,两条路径都可以工作。。。。