首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请问关于Java执行Oracle存储过程时参数为BLOB的有关问题

2013-03-26 
请教关于Java执行Oracle存储过程时参数为BLOB的问题!关于参数为BLOB的存储过程如下:--添加客户信息procedu

请教关于Java执行Oracle存储过程时参数为BLOB的问题!
关于参数为BLOB的存储过程如下:

    --添加客户信息
    procedure   addCustomer(--客户姓名
                                                v_customer_name   IN   CUSTOMER.NAME%TYPE,
                                                ...
                                                v_photo   IN   OUT   CUSTOMER.PHOTO%TYPE,
                                                --客户照片
                                                ...
                                                v_id   OUT   CUSTOMER.ID%TYPE
                                                --客户ID
                                                )
   
      IS
        v_char_id   customer.ID%TYPE;
        v_blob_photo   customer.photo%TYPE;
        ...  
  BEGIN
      --生成ID
      SELECT   SYS_GUID()   INTO   v_char_id   FROM   DUAL;      
 
    INSERT   INTO   CUSTOMER
            (ID,
              CUSTOMER_NAME,
              ...
              PHOTO,
              ...)
        VALUES
            (v_char_id,
              v_customer_name,
              ...
              EMPTY_BLOB(),     //先插入空BLOB
              ...
              );
   
        IF   (v_photo   IS   NOT   NULL)   THEN
            SELECT   PHOTO
                INTO   v_blob_photo
                FROM   CUSTOMER
              WHERE   CUSTOMER.ID   =   v_char_id
                  FOR   UPDATE;
       
            DBMS_LOB.OPEN(v_photo,   DBMS_LOB.lob_readonly);   --打开DBMS_LOB()包
            DBMS_LOB.OPEN(v_blob_photo,   DBMS_LOB.lob_readwrite);


            DBMS_LOB.append(v_blob_photo,   v_photo);   --追加要插入的照片到指定位置
            DBMS_LOB.close(v_photo);
            DBMS_LOB.close(v_blob_photo);
        END   IF;

        SELECT   v_char_id   INTO   v_id   FROM   DUAL;
   
        COMMIT;
=================================
以上省略部分与此问题无关的代码,存储过程已编译通过,如有问题请指正。

问题是Java部分,如何操作BLOB部分的代码?
Connection   conn   =   null;
OracleResultSet   ors   =   null;
OraclePreparedStatement   opst   =   null;

aCustomer.blobPhoto.putBytes(1,   photoBytes);   //   抛异常

oProc   =   (OracleCallableStatement)   conn.prepareCall( "{call   addCustomer(?,..?)} ");
oProc.setBLOB(1,   aCustomer.blobPhoto);

aCustomer.blobPhoto是BLOB类型,photoBytes是图片的字符流,想通过putBytes方法保存BLOB,作为参数传入存储过程,

抛出异常是:   空二进制大对象操作无效

上网查了一下,没有找到类似问题的解决方法。

请问有经验的朋友这种情况下存储过程和Java部分应该如何写?先谢谢了。

[解决办法]
blob 单独操作
[解决办法]
用流写,下边是以前写过的一段代码,有点恶心,别骂我

public static boolean setDocContent(String docId, File tempFile) {
Connection conn = DbManager.newConnection();
try {
PreparedStatement pstmt = conn.prepareStatement( "select content from doc_info where docid= ? for update nowait ");
try {
pstmt.setString(1, docId);
ResultSet rs = pstmt.executeQuery();
try {
if (rs.next()) {
Blob blob = rs.getBlob( "content ");
OutputStream os = blob.setBinaryStream(0);
try {
FileInputStream fis = new FileInputStream(tempFile);
try {
byte[] b = new byte[1024];
int i=0;
while ((i = fis.read(b, 0, 1024)) != -1) {
os.write(b, 0, i);
}
} finally {
fis.close();
tempFile.delete();
}
} finally {
os.close();
}
}
} finally {
rs.close();
}
} finally {
pstmt.close();
}
} finally {
conn.close();
}
}
[解决办法]
Oracle中得Blob要单独操作,需要先取得句柄,然后才能进行操作,可以上网查一下
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html

热点排行
Bad Request.