Ich versuche, in von BLOB
s übergeben, aber ich bekomme Fehler.Spring JDBC - Übergabe von ARRAY von BLOBs an SQL-Funktion
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);
Ich habe eine SQL-Typ in der DB
create or replace TYPE BLOB_ARRAY is table of BLOB;
Funktion Spec
FUNCTION insertFiles(p_userId IN NUMBER,
p_files IN BLOB_ARRAY)
RETURN NUMBER;
Funktion Körper
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;
Ich bin nicht sicher, wie man richtig das Array übergeben von Blobs zur SQL-Funktion.
Fehler:
java.sql.SQLException: Fail to convert to internal representation: [email protected] at oracle.jdbc.oracore.OracleTypeBLOB.toDatum(OracleTypeBLOB.java:69) ~[ojdbc7.jar:12.1.0.1.0] at oracle.jdbc.oracore.OracleType.toDatumArray(OracleType.java:176) ~[ojdbc7.jar:12.1.0.1.0] at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1321) ~[ojdbc7.jar:12.1.0.1.0] at oracle.sql.ARRAY.(ARRAY.java:140) ~[ojdbc7.jar:12.1.0.1.0] at
UPDATE
Nach Luke Vorschlag versucht, ich die folgende Störung erhalte:
uncategorized SQLException for SQL [{? = call FILES_PKG.INSERTFILES(?, ?)}]; SQL state [99999]; error code [22922]; ORA-22922: nonexistent LOB value ; nested exception is java.sql.SQLException: ORA-22922: nonexistent LOB value ] with root cause
java.sql.SQLException: ORA-22922: nonexistent LOB value
danke für die Antwort, ich meine Frage aktualisiert. Ich habe anscheinend einen weiteren Fehler bei der Erstellung des 'BLOB' mit der' Connection' gefunden. Ich habe auch die Parameternamen konsistent gemacht. – Alan
@Alan: Entschuldigung, dass Ihr Code immer noch einen Fehler zurückgibt. Das ist wahrscheinlich meine Schuld, weil ich mich nicht darum gekümmert habe, eine ordnungsgemäß gespeicherte Funktion zum Testen zu schreiben! Ich habe meine Antwort bearbeitet, um einen "einfachen" JDBC-Ansatz hinzuzufügen, der für mich funktioniert, indem ich damit Ihre Funktion aufrufen kann. –
Danke! Ich habe meinen Kopf für ein paar Tage gegen dieses Problem geschlagen und habe versucht, es "Frühling" zu machen, und das scheint gut zu funktionieren. – Alan