java.sql.SQLException:ORA-01461:只能绑定LONG值才能插入LONG列

时间:2012-07-09 11:02:36

标签: java jdbc oracle11g blob

我正在使用一个简单的界面(在jsf 1.2和富面3.3.2,Oracle 11g R1中)让用户选择富图片文件:fileUpload并保存在表格中。 作为测试,我创建了下表。

CREATE TABLE TEST
(
 MIME_TYPE VARCHAR2 (1000),
 PHOTO BLOB,
 STUDENT_ID NUMBER NOT NULL
)

将图片保存到BLOB字段的代码片段如下。

//......From the uploadFile Listener
public void listener(UploadEvent event) throws Exception {
...      
item = event.getUploadItem();
...
StudentPhotoDAO dao = new StudentPhotoDAO();
dao.storePhoto(item.getData(),item.getContentType(),studentId);
...
}


//......From the PhotoDAO ..........................


public void storePhoto(byte data[],String mimeType, Long studentId){
{
 ...
  ByteArrayInputStream bis=new ByteArrayInputStream(data);
  String query = "update  TEST set PHOTO = ? ,MIME_TYPE = ?  where STUDENT_ID=?";
  pstmt = conn.prepareStatement(query);
  pstmt.setAsciiStream(1,(InputStream)bis,data.length);
  pstmt.setString(2,mimeType.toString());
  pstmt.setLong(3,studentId);
  pstmt.executeUpdate();
 }

我收到以下错误:

java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column

请问代码中的错误在哪里。

感谢。

5 个答案:

答案 0 :(得分:2)

您将student_id指定为number,似乎映射到BigInteger。参见例如this table

要么提供BigInteger,要么需要更改student_id的类型。

答案 1 :(得分:1)

看看Oracle LONG type description: “LONG是用于存储字符数据的Oracle数据类型......”。所以LONG不是Oracle中的数字。这是一个文本。

我认为你因为这个而得到了这个错误: pstmt.setAsciiStream(1,(InputStream)bis,data.length);

尝试使用pstmt.setBinaryStream(int, InputStream, int)pstmt.setBinaryStream(int, InputStream, long)

答案 2 :(得分:0)

您正在致电

pstmt.setLong(3,studentId);

并将列指定为

STUDENT_ID NUMBER NOT NULL

以及文档如何说:

  

尝试从LONG数据类型中插入值   另一种数据类型。这是不允许的。

所以就这样吧:

STUDENT_ID INTEGER NOT NULL
pstmt.setInt(3, studentId);

答案 3 :(得分:0)

将大型二进制流绑定到Oracle中的BLOB列时,请使用PreparedStatement.setBlob()而不是setAsciiStream()setBinaryStream()

答案 4 :(得分:0)

我猜使用ASCII流是罪魁祸首。

push

尝试

if (datasets[catName].data.indexOf($(this).val()) === -1) {

(看起来Oracle解释长度参数为LONG且不能超过4000字节的ASCII流。但这只是未经证实的猜测。)