我尝试将保存为字节数组的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();
答案 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数据类型,但不允许进行此转换。