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