【问题标题】:Java Oracle Blob to Blob comparisons failling using PreparedStatement statementJava Oracle Blob 到 Blob 比较失败使用 PreparedStatement 语句
【发布时间】:2017-11-23 02:04:47
【问题描述】:

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

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();

但出现异常错误

java.sql.SQLException: ORA-06553: PLS-306: wrong number or types of arguments in call to 'CAST_TO_VARCHAR2'

【问题讨论】:

  • 那么,CAST_TO_VARCHAR2 的定义和调用它的代码在哪里?此外,您的“选择”查询也不正确 - 缺少“FROM”
  • 你为什么要表演这个演员:(String)"yes"?这是多余的。
  • 为什么 from 是错误的?

标签: java oracle blob


【解决方案1】:

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

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

但您正在尝试致电p.executeUpdate();
根据文档:PreparedStatement#ecexuteUpdate()

执行此 PreparedStatement 对象中的 SQL 语句,它 必须是 SQL 数据操作语言 (DML) 语句,例如 插入、更新或删除;或不返回任何内容的 SQL 语句, 比如一个 DDL 语句。

也就是说 - 此方法不适用于执行 SELECT 语句。只有 INSERT、DELETE、UPDATE 或返回空的 SQL - SELECT 返回结果集。


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

char1 LIKE char2 [ ESCAPE asc_chars ]
所有的字符表达式 (char1、char2 和 esc_char)可以是任何数据类型 CHAR, VARCHAR2、NCHAR 或 NVARCHAR2。如果它们不同,则 Oracle 转换 都是char1的数据类型。

如您所见,BLOB 数据类型在此处不作为参数分配。 BLOB 数据类型被用作 LIKE 运算符的参数 --> p.setBlob(1,blob);,因此抛出错误:ORA-06553: PLS-306: wrong number or types of arguments in call to 'CAST_TO_VARCHAR2' 因为 Oracle 尝试将 BLOB 转换为 VARCHAR2 数据类型,但不允许这种转换。

【讨论】:

  • 谢谢,所以如果我将查询更改为 VAL = ?并将其替换为 executeQuery() 应该可以吗?怎么办?或者没有办法将 Blob 与 Blob 进行比较?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2012-03-14
  • 2018-05-20
  • 2017-09-30
  • 2014-02-21
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多