【问题标题】:Dynamically create Blob in DB2 Java stored procedure在 DB2 Java 存储过程中动态创建 Blob
【发布时间】:2011-03-06 17:31:30
【问题描述】:

我想从用 Java 编写的 DB2 存储过程中以 Blob 形式返回一些数据。

这是在 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 作为输出参数“备份”。问题是,我不知道如何动态创建 blob,因为 java.sql.Blob 本身就是一个接口。我可以像这样使用虚拟 SQL 创建一个 blob:

// 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

如果存在在 DB2 中动态创建 blob 的工具,有什么想法吗?

【问题讨论】:

标签: sql stored-procedures jdbc db2 blob


【解决方案1】:

这是IBM 的建议。无需使用 DB2 存储过程,您只需从 Java 代码中进行查询即可。

PreparedStatement preparedStatement = 
    connection.prepareStatement(
    "SELECT BOOKCOVER FROM BOOKCOVERS WHERE BOOKISBN=?"); 
preparedStatement.setString(1, "0738425826"); 
ResultSet resultSet = preparedStatement.executeQuery(); 
while (resultSet.next()) { 
    // materialization of the Blob 
    Blob blob = resultSet.getBlob(1); 
    InputStream inputStream = blob.getBinaryStream(); 
    File fileOutput = new 
        File("C:\\clonedredbookcover.jpg"); 
    FileOutputStream fo = new
        FileOutputStream(fileOutput); 
    int c; 
    while ((c = inputStream.read()) != -1) 
        fo.write(c); 
    fo.close(); 
    System.out.println("Blob retrieved"); 

【讨论】:

  • 我应该更清楚一点:blob 不是来自查询,而是通过读取驻留在数据库服务器上的一些文件创建的 zip 文件。 (不是最优雅的设计,但不幸的是我们必须使用它。)因此我认为你的建议不适用。
  • @inflagranti:哦。那么,您可能必须编写一个实现 Blob 接口的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多