Я хотел бы вернуть некоторые данные в виде большого двоичного объекта из хранимой процедуры DB2, написанной на Java.
Это код для генерации процедуры на сервере DB2:
CREATE PROCEDURE CLUB.P_CLUB_GET_BACKUP ( IN CLUBID INTEGER,
IN BNR INTEGER,
OUT BACKUP BLOB(50000000) )
NO SQL
NOT DETERMINISTIC
LANGUAGE Java
EXTERNAL NAME 'P_CLUB_GET_BACKUP:ch.swissasp.vvv.procedures.P_GET_BACKUP1.p_GET_BACKUP1'
FENCED
THREADSAFE
PARAMETER STYLE JAVA
И соответствующий код Java такой:
/**
* SQLJ Stored Procedure P_GET_BACKUP
* @param clubID
* @param backupID
* @param Backup
*/
package ch.swissasp.vvv.procedures;
import java.io.File;
import java.io.FileInputStream;
import java.sql.SQLException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class P_GET_BACKUP1
{
public static void p_GET_BACKUP1(int clubID, int backupNr, java.sql.Blob[] backup)
throws SQLException,
Exception
{
// create blob and return as output parameter 'backup'
}
}
Теперь мне нужен какой-то способ генерирования BLOB-объекта из некоторых двоичных данных, которые создаются в хранимой процедуре (поэтому BLOB-объект не приходит из запроса, а считывает данные, находящиеся на сервере базы данных), а затем возвращает это blob в качестве выходного параметра 'backup'. Проблема в том, что я понятия не имею, как динамически создавать BLOB-объекты, так как сам java.sql.Blob является интерфейсом. Я могу создать BLOB-объект, используя фиктивный SQL как таковой:
// create a blob the complicated way...
Connection con = DriverManager.getConnection("jdbc:default:connection");
con.setReadOnly(true);
PreparedStatement stmt = con.prepareStatement("VALUES (Cast(? AS Blob))");
stmt.setBytes(1, new byte[0]);
ResultSet rs = stmt.executeQuery();
rs.next();
Blob blob = rs.getBlob(1);
rs.close();
А затем используйте это так:
OutputStream out = blob.setBinaryStream(1L); // get output stream to blob
// code to write the data to output stream
out.close(); // close blob
backup[0] = blob; // set output param
Но я бы предпочел заменить весь этот код SQL на что-то вроде этого:
java.sql.Blob blob = new DB2Blob(); // dynamically allocate blob
Есть ли идеи, если существует такая возможность динамически создавать BLOB-объекты в DB2?