请教关于Java执行Oracle存储过程时参数为BLOB的问题!
关于参数为BLOB的存储过程如下:
--添加客户信息
procedure addCustomer(--客户姓名
v_customer_name IN CUSTOMER.NAME%TYPE,
...
v_photo IN OUT CUSTOMER.PHOTO%TYPE,
--客户照片
...
v_id OUT CUSTOMER.ID%TYPE
--客户ID
)
IS
v_char_id customer.ID%TYPE;
v_blob_photo customer.photo%TYPE;
...
BEGIN
--生成ID
SELECT SYS_GUID() INTO v_char_id FROM DUAL;
INSERT INTO CUSTOMER
(ID,
CUSTOMER_NAME,
...
PHOTO,
...)
VALUES
(v_char_id,
v_customer_name,
...
EMPTY_BLOB(), //先插入空BLOB
...
);
IF (v_photo IS NOT NULL) THEN
SELECT PHOTO
INTO v_blob_photo
FROM CUSTOMER
WHERE CUSTOMER.ID = v_char_id
FOR UPDATE;
DBMS_LOB.OPEN(v_photo, DBMS_LOB.lob_readonly); --打开DBMS_LOB()包
DBMS_LOB.OPEN(v_blob_photo, DBMS_LOB.lob_readwrite);
DBMS_LOB.append(v_blob_photo, v_photo); --追加要插入的照片到指定位置
DBMS_LOB.close(v_photo);
DBMS_LOB.close(v_blob_photo);
END IF;
SELECT v_char_id INTO v_id FROM DUAL;
COMMIT;
=================================
以上省略部分与此问题无关的代码,存储过程已编译通过,如有问题请指正。
问题是Java部分,如何操作BLOB部分的代码?
Connection conn = null;
OracleResultSet ors = null;
OraclePreparedStatement opst = null;
aCustomer.blobPhoto.putBytes(1, photoBytes); // 抛异常
oProc = (OracleCallableStatement) conn.prepareCall( "{call addCustomer(?,..?)} ");
oProc.setBLOB(1, aCustomer.blobPhoto);
aCustomer.blobPhoto是BLOB类型,photoBytes是图片的字符流,想通过putBytes方法保存BLOB,作为参数传入存储过程,
抛出异常是: 空二进制大对象操作无效
上网查了一下,没有找到类似问题的解决方法。
请问有经验的朋友这种情况下存储过程和Java部分应该如何写?先谢谢了。
[解决办法]
blob 单独操作
[解决办法]
用流写,下边是以前写过的一段代码,有点恶心,别骂我
public static boolean setDocContent(String docId, File tempFile) {
Connection conn = DbManager.newConnection();
try {
PreparedStatement pstmt = conn.prepareStatement( "select content from doc_info where docid= ? for update nowait ");
try {
pstmt.setString(1, docId);
ResultSet rs = pstmt.executeQuery();
try {
if (rs.next()) {
Blob blob = rs.getBlob( "content ");
OutputStream os = blob.setBinaryStream(0);
try {
FileInputStream fis = new FileInputStream(tempFile);
try {
byte[] b = new byte[1024];
int i=0;
while ((i = fis.read(b, 0, 1024)) != -1) {
os.write(b, 0, i);
}
} finally {
fis.close();
tempFile.delete();
}
} finally {
os.close();
}
}
} finally {
rs.close();
}
} finally {
pstmt.close();
}
} finally {
conn.close();
}
}
[解决办法]
Oracle中得Blob要单独操作,需要先取得句柄,然后才能进行操作,可以上网查一下
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html