SELECT AFTER INSERT - Mailing list pgsql-general

From Juleni
Subject SELECT AFTER INSERT
Date
Msg-id 1102062718.20041014105836@opensubsystems.org
Whole thread Raw
List pgsql-general
Hello,

   I'm using postgreSQL 8.0 beta1 and JDK 1.4.

   I have following problem:
I have create test table that contains only unique column :

CREATE TABLE UNIQUE_COLUMN_TEST (
   TEST_ID INTEGER,
   CONSTRAINT TEST_ID_UQ UNIQUE (TEST_ID)
)

Within one transaction I have insert a few records into the table.
After that I have insert one more record that already exists within
the table. It gives me constraint exception - it's OK. This exception is
catched within the catch(SQLException) block. In this block then I have
try to do select into the table, but it gives me next exception:

   org.postgresql.util.PSQLException: ERROR: current transaction is aborted,
   commands ignored until end of transaction block


   Is this correct postgres behaviour? How can I solve this problem?

   Thank you in advance for your advice,
   with best regards,

   Julian Legeny



   Here is my jUnit test:

   /**
    * Test for selecting data after inserting records and then inserting duplicate record
    * into the unique table column.
    *
    * @throws Throwable - an error has occured during test
    */
   public void testSelectAfterInsertIntoUniqueColumn(
   ) throws Throwable
   {
      final String INSERT_VALUE = "insert into UNIQUE_COLUMN_TEST (TEST_ID) values (?)";
      final String SELECT_VALUE = "select count(*) from UNIQUE_COLUMN_TEST";
      final String DELETE_ALL = "delete from UNIQUE_COLUMN_TEST";

      PreparedStatement insertStatement = null;
      PreparedStatement deleteStatement = null;
      PreparedStatement selectStatement = null;
      ResultSet         rsResults       = null;
      int               iDeletedCount   = 0;
      int iCounter;

      try
      {
         //******************************************************************
         // Try to select original record to verify that the database is in OK state
         m_transaction.begin();
         try
         {
            deleteStatement = m_connection.prepareStatement(DELETE_ALL);

            iDeletedCount = DatabaseUtils.executeUpdateAndClose(deleteStatement);

            m_transaction.commit();
         }
         catch (Throwable throwable)
         {
            m_transaction.rollback();
            throw throwable;
         }

         assertEquals("No records should be initially in the database.",
                             0, iDeletedCount);

         // insert value
         m_transaction.begin();
         try
         {
            Connection connection = null;

            try
            {
               // try to insert 5 records
               for (iCounter = 1; iCounter < 6; iCounter++)
               {
                  insertStatement = m_connection.prepareStatement(INSERT_VALUE);
                  insertStatement.setInt(1, 100 * iCounter);

                  insertStatement.executeUpdate();
               }
               // insert duplicite value into unique column
               try
               {
                  insertStatement = m_connection.prepareStatement(INSERT_VALUE);
                  insertStatement.setInt(1, 100);

                  insertStatement.executeUpdate();
               }
               catch (SQLException sqlExc)
               {
                  try
                  {
                     // it should be exception here
                     selectStatement = m_connection.prepareStatement(SELECT_VALUE);
                     rsResults = selectStatement.executeQuery();

                     if (rsResults.next())
                     {
                        assertEquals("Incorrect number of selected items",
                                     5, rsResults.getInt(1));
                     }
                  }
                  catch (SQLException sqlExc1)
                  {
                     // selectStatement gives me next exception
                     throw new SQLException();
                  }
                  finally
                  {
                     rsResults.close();
                  }
               }
            }
            finally
            {
               DatabaseUtils.closeStatement(insertStatement);
               DatabaseUtils.closeStatement(selectStatement);
            }
            m_transaction.commit();
         }
         catch (Throwable throwable)
         {
            m_transaction.rollback();
            throw throwable;
         }
      }
      finally
      {
         // delete inserted data
         m_transaction.begin();
         try
         {
            deleteStatement = m_connection.prepareStatement(DELETE_ALL);
            iDeletedCount = DatabaseUtils.executeUpdateAndClose(deleteStatement);
            m_transaction.commit();

         }
         catch (Throwable throwable)
         {
            m_transaction.rollback();
            throw throwable;
         }
         finally
         {
            DatabaseUtils.closeStatement(deleteStatement);
         }
         assertEquals("Exactly 5 records with data shoud have been deleted.",
                             5, iDeletedCount);
      }
   }


pgsql-general by date:

Previous
From: Nageshwar Rao
Date:
Subject: clustering
Next
From: Ed Stoner
Date:
Subject: Numeric user names