Java Oracle Blob to Blob使用PreparedStatement语句进行比较

时间:2017-11-22 14:41:11

标签: java oracle blob

我尝试将保存为字节数组的blob内的字符串与SQL查询中的字符串进行比较 根据我的理解,我需要将值转换为Blob,然后比较Blob和Blob 但我得到错误

<div className="mdc-layout-grid__inner"></div>

但是出现异常错误

String s = "SELECT * FROM TEST VAL like ?";
Blob blob = conn.createBlob();
blob.setBytes(1, ((String)"yes").getBytes("UTF-8"));
PreparedStatement p = conn.prepareStatement(s);
p.setBlob(1,blob);
p.executeUpdate();

1 个答案:

答案 0 :(得分:1)

第一个错误是该语句是SELECT语句:

String s = "SELECT * FROM TEST VAL like ?";

但您正试图致电p.executeUpdate();
根据以下文件:PreparedStatement#ecexuteUpdate()

  

在此PreparedStatement对象中执行SQL语句   必须是SQL数据操作语言(DML)语句,例如   INSERT,UPDATE或DELETE;或者什么都不返回的SQL语句,   例如DDL声明。

即 - 此方法不用于执行SELECT语句。只有INSERT,DELETE,UPDATE或返回nothins的SQL - SELECT返回结果集。

另一个错误是,根据LIKE operator的文档,他们的参数只能是以下数据类型:

  

char1 LIKE char2 [ESCAPE asc_chars]
  所有的角色表达   (char1,char2和esc_char)可以是任何数据类型CHAR,   VARCHAR2,NCHAR或NVARCHAR2。如果它们不同,那么Oracle会转换   所有这些都是char1的数据类型。

如您所见,BLOB数据类型在这里不作为参数。 BLOB数据类型用作LIKE运算符的参数 - &gt; p.setBlob(1,blob);,因此引发了错误:ORA-06553: PLS-306: wrong number or types of arguments in call to 'CAST_TO_VARCHAR2'因为Oracle试图将BLOB转换为VARCHAR2数据类型,但不允许进行此转换。