You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Kristian Waagan (JIRA)" <ji...@apache.org> on 2011/08/16 14:09:27 UTC

[jira] [Updated] (DERBY-5183) Cannot get BLOB value in the result set

     [ https://issues.apache.org/jira/browse/DERBY-5183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Kristian Waagan updated DERBY-5183:
-----------------------------------

    Affects Version/s: 10.3.3.0
                       10.4.1.3
        Fix Version/s: 10.4.2.0

I downloaded the BIRT sample database and ran the second repro program.
This bug appears only in versions 10.3.3.0 and 10.4.1.3.

> Cannot get BLOB value in the result set
> ---------------------------------------
>
>                 Key: DERBY-5183
>                 URL: https://issues.apache.org/jira/browse/DERBY-5183
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.3.3.0, 10.4.1.3
>            Reporter: dingyan
>             Fix For: 10.4.2.0
>
>
> There is a table include BLOB and CLOB data,column 3 is CLOB and column 4 is BLOB
> when i try to get the data from this table,in some cases,SQLException is thrown :The data in this BLOB or CLOB is no longer available.  The BLOB/CLOB's transaction may be committed, or its connection is closed
> when i get the CLOB and BLOB data without the stream read,it is ok,my test source code as below:
> import java.io.InputStream;
> import java.sql.Clob;
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
> import java.sql.ResultSet;
> import java.sql.ResultSetMetaData;
> import java.sql.SQLException;
> public class Test {
> 	public static String driverClass = "org.apache.derby.jdbc.EmbeddedDriver";
> 	public static String driverURL = "jdbc:derby:d:\\BirtSample";
> 	public static String user = "ClassicModels";
> 	public static String squery = "select * from CLASSICMODELS.PRODUCTLINES,CLASSICMODELS.PRODUCTS where CLASSICMODELS.PRODUCTS.PRODUCTLINE = CLASSICMODELS.PRODUCTLINES.PRODUCTLINE";
> 	private static int i = 0;
> 	public static void main( String[] args )
> 	{
> 		
>      try {         
>     	  Class.forName(driverClass);
> 			Connection c = DriverManager.getConnection(driverURL, user, "");
> 			PreparedStatement s = c.prepareStatement(squery);
> 			c.setAutoCommit(false);
> 			ResultSet r = s.executeQuery();
> 			ResultSetMetaData meta = r.getMetaData();
>     	  int count = meta.getColumnCount();
>     	  try{
>        	   while(r.next()) { 
>     		   r.getString(1);
>     		   r.getString(2);
>     		   Clob clob = r.getClob(3);
> //    		   byte[] b = new byte[(int)clob.length()];
> //    		   InputStream stream = clob.getAsciiStream();
> //    		   stream.read(b);
> //    		   stream.close();
> //    		   Reader reader = clob.getCharacterStream();
> //    		   reader.read(b);
> //    		   reader.close();
>     		   System.out.println( r.getBlob(4)); 
>     		   
>         	   System.out.println( "row count=" + i);     			   
>         	   i++;
>     	   }}catch( SQLException ex)
>     	   {
>     		   ex.printStackTrace();
>     	   } 
>     	   s.close(); 
>           }
>     	  catch(Exception e) 
>     	  {     
>     		  e.printStackTrace();
>     	  }   
>     
> 	}
> }
> but when i read after get the CLOB,source code as below:
> import java.io.InputStream;
> import java.sql.Clob;
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
> import java.sql.ResultSet;
> import java.sql.ResultSetMetaData;
> import java.sql.SQLException;
> public class Test {
> 	public static String driverClass = "org.apache.derby.jdbc.EmbeddedDriver";
> 	public static String driverURL = "jdbc:derby:d:\\BirtSample";
> 	public static String user = "ClassicModels";
> 	public static String squery = "select * from CLASSICMODELS.PRODUCTLINES,CLASSICMODELS.PRODUCTS where CLASSICMODELS.PRODUCTS.PRODUCTLINE = CLASSICMODELS.PRODUCTLINES.PRODUCTLINE";
> 	private static int i = 0;
> 	public static void main( String[] args )
> 	{
> 		
>      try {         
>     	  Class.forName(driverClass);
> 			Connection c = DriverManager.getConnection(driverURL, user, "");
> 			PreparedStatement s = c.prepareStatement(squery);
> 			c.setAutoCommit(false);
> 			ResultSet r = s.executeQuery();
> 			ResultSetMetaData meta = r.getMetaData();
>     	  int count = meta.getColumnCount();
>     	  try{
>        	   while(r.next()) { 
>     		   r.getString(1);
>     		   r.getString(2);
>     		   Clob clob = r.getClob(3);
>     		   byte[] b = new byte[(int)clob.length()];
>     		   InputStream stream = clob.getAsciiStream();
>     		   stream.read(b);
>     		   stream.close();
> //    		   Reader reader = clob.getCharacterStream();
> //    		   reader.read(b);
> //    		   reader.close();
>     		   System.out.println( r.getBlob(4)); 
>     		   
>         	   System.out.println( "row count=" + i);     			   
>         	   i++;
>     	   }}catch( SQLException ex)
>     	   {
>     		   ex.printStackTrace();
>     	   } 
>     	   s.close(); 
>           }
>     	  catch(Exception e) 
>     	  {     
>     		  e.printStackTrace();
>     	  }   
>     
> 	}
> }
> the SQLException is thrown when get the row 89,error info as below:
> ...
> org.apache.derby.impl.jdbc.EmbedBlob@a9255c
> row count=89
> java.sql.SQLException: The data in this BLOB or CLOB is no longer available.  The BLOB/CLOB's transaction may be committed, or its connection is closed.
> 	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.EmbedResultSet.getBlob(Unknown Source)
> 	at Test.main(Test.java:42)
> Caused by: java.sql.SQLException: The data in this BLOB or CLOB is no longer available.  The BLOB/CLOB's transaction may be committed, or its connection is closed.
> 	at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
> 	... 8 more
> Caused by: ERROR XJ073: The data in this BLOB or CLOB is no longer available.  The BLOB/CLOB's transaction may be committed, or its connection is closed.
> 	at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
> 	at org.apache.derby.impl.jdbc.EmbedBlob.<init>(Unknown Source)
> 	... 2 more
> when i try to this test on oracle ,this problem will not happen,so i think maybe this is a bug of Derby
> your help will be highly apperaciated

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira