Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:ORA-01461:只能为插入到长列中绑定长值_Java_Jdbc_Oracle11g_Blob - Fatal编程技术网

java.sql.SQLException:ORA-01461:只能为插入到长列中绑定长值

java.sql.SQLException:ORA-01461:只能为插入到长列中绑定长值,java,jdbc,oracle11g,blob,Java,Jdbc,Oracle11g,Blob,我使用一个简单的界面(在JSF1.2和RichFaces3.3.2、Oracle11GR1中)让用户通过rich:fileUpload选择图片并保存在表中。 作为测试,我创建了下表 CREATE TABLE TEST ( MIME_TYPE VARCHAR2 (1000), PHOTO BLOB, STUDENT_ID NUMBER NOT NULL ) 将图片保存到BLOB字段的代码片段如下所示 //......From the uploadFile Listener public v

我使用一个简单的界面(在JSF1.2和RichFaces3.3.2、Oracle11GR1中)让用户通过rich: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
请问代码中的错误在哪里


谢谢。

您将
学生id
指定为
编号
,它似乎映射到
大整数
。见例

您可以提供一个
biginger
,或者您需要更改正在调用的
student\u id

的类型

pstmt.setLong(3,studentId);
您将列指定为

STUDENT_ID NUMBER NOT NULL
医生是怎么说的:

试图将长数据类型中的值插入到 另一个数据类型。这是不允许的

就这样吧:

STUDENT_ID INTEGER NOT NULL
pstmt.setInt(3, studentId);
看看: “LONG是用于存储字符数据的Oracle数据类型…”。甲骨文中的数字不是那么长。这是一篇课文

我想你之所以会犯这个错误是因为:
pstmt.setascistream(1,(InputStream)bis,data.length)


尝试使用
pstmt.setBinaryStream(int,InputStream,int)
pstmt.setBinaryStream(int,InputStream,long)
将大型二进制流绑定到Oracle中的BLOB列时,请使用
PreparedStatement.setBinaryStream()
而不是
setascistream()
setBinaryStream()

我想应该归咎于使用ASCII流

pstmt.setAsciiStream(1, (InputStream) bis, data.length);
试一试


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

SQL类型编号似乎与Java类型LONG不兼容。在Oracle中,LONG是文本类型,而不是数字类型。这些答案中的大多数都找错了地方。谢谢你的回复。我确实把学生id转换成了BigInteger。但如何将其映射到preparedStatement参数。由于没有pstmt.setBigInteger方法…使用了此错误,但错误相同:biginger bi=biginger.valueOf(studentId.longValue());String query=“更新测试集照片=?,MIME_类型=?其中STUDENT_ID=“+bi+”;试着用
setObject()
instead来设置它。你能输入一些代码吗?如何使用setObject()(我在这里是初学者)不能更改数字的列。(这是一种强迫,我可以告诉你,但我必须*我会告诉你的;)。整数oracle数据类型相当于数字(28)。这里的问题与第一个绑定值有关,而不是第三个…pstmt。当数据超过4000时,setBinaryStream(int,InputStream,int)抛出相同的异常bytes@AjaySharma,证明plz。我无法在测试中重现它。
pstmt.setBinaryStream(1, new ByteArrayInputStream(data));