【发布时间】:2016-06-17 21:39:44
【问题描述】:
我正在尝试传递BLOBs 中的ARRAY,但我遇到了错误。
uploadFiles = new SimpleJdbcCall(dataSource).withCatalogName("FILES_PKG")
.withFunctionName("insertFiles").withReturnValue()
.declareParameters(new SqlParameter("p_userId", Types.NUMERIC),
new SqlParameter("p_data", Types.ARRAY, "BLOB_ARRAY"),
new SqlOutParameter("v_groupId", Types.NUMERIC));
uploadFiles.compile();
List<Blob> fileBlobs = new ArrayList<>();
for(int x = 0; x < byteFiles.size(); x++){
fileBlobs.add(new javax.sql.rowset.serial.SerialBlob(byteFiles.get(x)));
}
final Blob[] data = fileBlobs.toArray(new Blob[fileBlobs.size()]);
SqlParameterSource in = new MapSqlParameterSource()
.addValue("p_files", new SqlArrayValue<Blob>(data, "BLOB_ARRAY"))
.addValue("p_userId", userId);
Map<String, Object> results = uploadFiles.execute(in);
我在数据库中创建了一个 SQL 类型
create or replace TYPE BLOB_ARRAY is table of BLOB;
功能说明
FUNCTION insertFiles(p_userId IN NUMBER,
p_files IN BLOB_ARRAY)
RETURN NUMBER;
函数体
FUNCTION insertFiles (p_userId IN NUMBER,
p_files IN BLOB_ARRAY)
RETURN NUMBER
AS
v_groupId NUMBER := FILE_GROUP_ID_SEQ.NEXTVAL;
v_fileId NUMBER;
BEGIN
FOR i IN 1..p_files.COUNT
LOOP
v_fileId := FILE_ID_SEQ.NEXTVAL;
BEGIN
INSERT INTO FILES
(FILE_ID,
FILE_GROUP_ID,
FILE_DATA,
UPDT_USER_ID)
SELECT
v_fileId,
v_groupId,
p_files(i),
USER_ID
FROM USERS
WHERE USER_ID = p_userId;
EXCEPTION WHEN OTHERS THEN
v_groupId := -1;
END;
END LOOP;
RETURN v_groupId;
END insertFiles;
我不确定如何正确地将 Blob 数组传递给 SQL 函数。
错误:
java.sql.SQLException:无法转换为内部表示: javax.sql.rowset.serial.SerialBlob@87829c90 在 oracle.jdbc.oracore.OracleTypeBLOB.toDatum(OracleTypeBLOB.java:69) ~[ojdbc7.jar:12.1.0.1.0] 在 oracle.jdbc.oracore.OracleType.toDatumArray(OracleType.java:176) ~[ojdbc7.jar:12.1.0.1.0] 在 oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1321) ~[ojdbc7.jar:12.1.0.1.0] 在 oracle.sql.ARRAY.(ARRAY.java:140) ~[ojdbc7.jar:12.1.0.1.0] 在
更新
尝试卢克的建议后,我收到以下错误:
未分类的 SQL 异常 SQL [{? = 调用 FILES_PKG.INSERTFILES(?, ?)}]; SQL 状态 [99999];错误代码 [22922]; ORA-22922: 不存在 LOB 值;嵌套异常是 java.sql.SQLException: ORA-22922: 不存在的 LOB 值] 有根本原因
java.sql.SQLException: ORA-22922: LOB 值不存在
【问题讨论】:
标签: java sql spring oracle jdbc