2012-07-09 72 views
2

我正在使用一個簡單的接口(在jsf 1.2和rich faces 3.3.2,Oracle 11g R1中)讓用戶選擇豐富的圖片:fileUpload並保存在表格中。 作爲一項測試,我創建了下表。java.sql.SQLException:ORA-01461:只能將LONG值綁定到插入到LONG列中

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 

哪裏是在代碼中的錯誤,請。

謝謝。

+1

它出現在SQL類型NUMBER與Java類型Long不兼容。 – 2012-07-09 11:15:59

+0

在Oracle中,LONG是文本類型,而不是數字類型。這些答案中的大部分都在錯誤的地方尋找。 – HardlyKnowEm 2014-10-07 15:39:58

回答

2

您指定student_idnumber,這似乎映射到BigInteger。見例如this table

您可以提供BigInteger或者您需要更改student_id的類型。

+0

感謝您的回覆。我確實將student_id轉換爲BigInteger。但是如何將它映射到preparedStatement參數。因爲沒有pstmt.setBigInteger方法... – learner 2012-07-09 11:53:54

+0

使用此但相同的錯誤BigInteger bi = BigInteger.valueOf(studentId.longValue()); String query =「Update TEST SET PHOTO =?,MIME_TYPE =?where STUDENT_ID =」+ bi +「」; – learner 2012-07-09 12:05:27

+0

嘗試使用setObject()代替 – 2012-07-09 17:19:12

0

要調用

pstmt.setLong(3,studentId); 

,你指定列

STUDENT_ID NUMBER NOT NULL 

以及如何文檔說:

An attempt was made to insert a value from a LONG datatype into another datatype. This is not allowed.

因此,只要這樣的:

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

無法將NUMBER中的列更改。 (我可以告訴你的一些強制性的,但是然後我會*你生病了)))。 – learner 2012-07-10 03:26:03

+0

INTEGER oracle數據類型相當於NUMBER(28) – ScrappyDev 2013-12-05 18:31:42

+0

[Oracle的'LONG'類型是字符數據類型](http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020)。這裏的問題與第一個綁定值有關,而不是第三個... – 2015-01-27 10:37:21

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)

0

將大型二進制流綁定到Oracle中的BLOB列時,請使用PreparedStatement.setBlob()而不是setAsciiStream()setBinaryStream()

0

我想使用ASCII流是怪。

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

嘗試

pstmt.setBinaryStream(1, new ByteArrayInputStream(data)); 

(它看起來像Oracle解釋ASCII流與長度參數爲LONG不能超過4000個字節。但是,這只是一個未經證實的猜測。)

相關問題