在DB2 Z/OS PreparedStatement中插入/更新十六进制值



我需要在我的数据库中插入一个十六进制值与Java中的PreparedStatement。

我可以用Hex函数来选择我的值:

String id = "02658947530232010038892587183C";
String request = "SELECT HEX(COLUMN) FROM TABLE WHERE HEX(COLUMN)=?";
Connection con = getConnectionDb2z();
ResultSet rs = null;
try(PreparedStatement select = con.prepareStatement(request))
{
insert.setString(1, id);
rs = select.executeQuery();
rs.next();
System.out.println(rs.getString("COLUMN"));
}
catch(SQLException e)
{
throw e;
}
finally
{
con.close();
}

我的结果是02658947530232010038892587183C.(这是一个例子)。

但是现在我想在我的表中插入一个值。如果我尝试:

String id = "02658947530232010038892587183C";
String request = "INSERT INTO TABLE (COLUMN) VALUES (X'?')";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setString(1, id);
insert.executeUpdate();
}

Java不能识别"(X'?') '中的?参数,我有一个错误:

线程"main"异常com.ibm.db2.jcc.am。SqlSyntaxErrorException: invalid parameter.

如果我尝试:

String id = "X'02658947530232010038892587183C'";
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setString(1, id);
insert.executeUpdate();
}

我也得到一个错误:

线程"main"异常com.ibm.db2.jcc.am。SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001

因为它试图将X'02658947530232010038892587183C'作为字符串插入。

我发现工作的唯一方法是:

String id = "02658947530232010038892587183C";
String request = "INSERT INTO TABLE (COLUMN) VALUES (X'?')";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request.replace("?", id))
{
insert.executeUpdate();
}

然而,这种方法是不可行的。有什么方法可以正确地做到这一点?

提醒一下,我的数据库是DB2 Z/OS, UNHEX函数不存在

更多说明:
在我的请求中,X'?'是一个用于打包十六进制值的函数。

长度COLUMN在我的TABLE是7。我的长度id是14,我需要打包这个id插入他在我的bdd。当我想在java代码中读取它时。

我用HEX(id)函数解包id。但是在DB2 Z/OS中,函数UNHEX不存在,我们需要使用X'id',但是正如您所看到的,PreparedStatement不将其识别为函数。

当我用X''函数包装此id02658947530232010038892587183C时,数据库中SELECT COLUMN FROM TABLE的结果是Áiåë�i g(您看到的结果不是我得到的确切结果,因为有网站无法读取的字符)。

如果我在我的选择中使用HEX()函数来解包idSELECT HEX(COLUMN) FROM TABLE,结果将是我更新了我的问题,以显示当我打包我的id时我需要得到什么。02658947530232010038892587183C.

为什么不直接从Java转换过来呢?

String id = "0038892587183C";
int idAsInt=Integer.parseInt(id, 16);
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setInt(1, idAsInt);
insert.executeUpdate();
}

这将id从十六进制转换为int,Integer.parseInt使用自定义基础16,以便将其解析为十六进制数。

则使用PreparedStatement#setInt设置参数,不使用X''

如果十六进制数超过int的signed 32位限制,则需要使用long(signed 64位)或BigInteger。不幸的是,JDBC不允许直接传递BigInteger,因此您需要使用下面提到的解决方案:

String id = "0038892587183C";
BigInteger idAsBigInt=new BigInteger(id, 16);//parse it to a BigInteger
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setBigDecimal(1, new BigDecimal(idAsBigInt));//or possibly insert.setString(1, String.valueOf(idAsBigInt));
insert.executeUpdate();
}

相关内容

  • 没有找到相关文章

最新更新