2010-06-22 2 views
0

Java로 작성된 DB2 저장 프로 시저에서 일부 데이터를 Blob로 리턴하고 싶습니다.DB2 Java 저장 프로 시저에서 Blob을 동적으로 작성하십시오.

/** 
* 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' 
    } 
    } 

내가 지금해야하는 것은을 생성 할 수있는 방법입니다 : 이것은

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 

그리고 해당 자바 코드 :

은 DB2 서버의 절차를 생성하는 코드 저장 프로 시저에서 생성 된 일부 이진 데이터의 BLOB (BLOB가 쿼리에서 왔지만 데이터베이스 서버에있는 데이터를 읽지 않음)이 BLOB을 출력 매개 변수 'backup'으로 반환합니다. 문제는, 내가 어떻게 blob을 동적으로 생성하는지에 대한 단서가 없다는 것이다. java.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(); 

을 그리고 다음과 같이 사용 : 나는 같은 더미 SQL을 사용하여 BLOB를 만들 수 있습니다

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을 동적으로 작성하는 기능이 있다면 어떤 아이디어가 있습니까?

+0

이 파티에 매우 늦었지만 SerialBlob을 생성하고 반환 할 수 없었습니까? BLOB 인터페이스를 구현하고 byte [] 생성자를가집니다. http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/serial/SerialBlob.html – Mike

+0

유망한 것으로 들립니다. 시간이 있으면 테스트 해 보겠습니다. –

답변

0

여기는 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"); 
+0

필자는이 점을 명확히해야합니다. blob은 쿼리에서 가져온 것이 아니라 db 서버에있는 일부 파일을 읽음으로써 생성되는 zip 파일입니다. (가장 우아한 디자인은 아니지만, 불행히도 우리는 그걸로 작업해야합니다.) 그러므로 당신이 제안한 것이 적용되지 않는다고 생각합니다. –

+0

@inflagranti : 오. 그렇다면 Blob 인터페이스를 구현하는 클래스를 작성해야 할 것입니다. –

관련 문제