Hi *,

I have a problem concerning an UPDATE statement.
Though a SELECT COUNT(*) returns 1 I get an exception when
I try to execute an UPDATE - see test code and output.

    SQL> UPDATE xyz SET ver=ver+1,len=?,data=?,bytes=? WHERE sid=? AND oid=? AND cur=1
    EXC: [-7012] More than one update row not allowed

When I leave out the binary column named "bytes", the statement
gets executed without exception.

	Source code:

import java.sql.*;


/**
 * Test database transaction isolation.
 */
public class UpdateTest {

    public static void main(String[] args) throws Exception {
        String driver   = "com.sap.dbtech.jdbc.DriverSapDB";
        String url      = "jdbc:sapdb://localhost/TANGRO?transport=socket";
        String user     = "user";
        String password = "password";

        //--- load driver ---
        Class.forName(driver);

        //--- connect to database ---
        Connection conn = getConnection(url, user, password);

        //--- display info ---
//        String info = getDbInfo(conn, true);
//        System.out.println(info);

        Statement stmt;

        //--- setup ---
        stmt = conn.createStatement();
        try {
            stmt.execute("DROP TABLE xyz");
            conn.commit();
        } catch (SQLException ex) { }
        stmt.execute("CREATE TABLE xyz (sid INTEGER NOT NULL, oid INTEGER NOT NULL, ver INTEGER NOT NULL, " +
                     "cur INTEGER NOT NULL, len INTEGER NOT NULL, data VARCHAR(30), bytes LONG BYTE, PRIMARY KEY (sid,oid,ver))");
        stmt.executeUpdate("INSERT INTO xyz (sid,oid,ver,cur,len,data,bytes) values (4711, 1, 1, 0, 10, 'a very old', x'112233')");
        stmt.executeUpdate("INSERT INTO xyz (sid,oid,ver,cur,len,data,bytes) values (4711, 1, 2, 0,  5, 'a old', x'445566')");
        stmt.executeUpdate("INSERT INTO xyz (sid,oid,ver,cur,len,data,bytes) values (4711, 1, 3, 1,  9, 'a current', x'778899')");
        stmt.executeUpdate("INSERT INTO xyz (sid,oid,ver,cur,len,data,bytes) values (4711, 2, 1, 1,  1, 'b', x'AABBCC')");
        conn.commit();

        PreparedStatement pstmt = conn.prepareStatement("SELECT COUNT(*) FROM xyz WHERE sid=? AND oid=? AND cur=1");
        pstmt.setInt(1, 4711);
        pstmt.setInt(2, 1);
        ResultSet rset = pstmt.executeQuery();
        rset.next();
        int count = rset.getInt(1);
        rset.close();
        System.out.println("count=" + count);

        pstmt = conn.prepareStatement("UPDATE xyz SET ver=ver+1,len=?,data=?,bytes=? WHERE sid=? AND oid=? AND cur=1");
        pstmt.setInt(1, -1);
        pstmt.setString(2, "update test");
        pstmt.setBytes(3, null);
        pstmt.setInt(4, 4711);
        pstmt.setInt(5, 1);
        int rc = pstmt.executeUpdate();
        System.out.println("rc=" + rc);
        conn.commit();
        conn.close();
        System.exit(0);
	}

    private static Connection getConnection(String url, String user, String password) throws SQLException {
        Connection conn = DriverManager.getConnection(url, user, password);
        conn.setAutoCommit(false);
        conn.setReadOnly(false);
        return conn;
    }

	// ... some helper functions for testing left out
}

//--- end of file ----------------------------------------------------------------------------------

Output:
C:\jdk1.3.1_06\bin\java.exe -classpath C:\tangro\classes;D:\sapdb\sapdb-jdbc-bin-7.3.00.29a.jar  de.tangro.sql.UpdateTest
  isReadOnly                     : false
  getAutoCommit                  : false
  getCatalog                     : null
  getURL                         : "jdbc:sapdb://localhost/TANGRO"
  getUserName                    : "DBA"
  getDriverName                  : "SAP DB"
  getDriverVersion               : "package com.sap.dbtech.jdbc, SAP DB JDBC Driver, SAP AG, 7.3.0    Build 029-000-087-559"
  getDriverMajorVersion          : 0
  getDriverMinorVersion          : 1
  getDatabaseProductName         : "SAP DB"
  getDatabaseProductVersion      : "Kernel    7.3.0    Build 029-000-087-809"
  getIdentifierQuoteString       : "
  getMaxColumnsInTable           : 254
  getMaxConnections              : 50
  getMaxStatements               : 2147483647
  getDefaultTransactionIsolation : TRANSACTION_READ_COMMITTED
  getTransactionIsolation        : TRANSACTION_READ_COMMITTED

count=1
com.sap.dbtech.jdbc.exceptions.DatabaseException: SAP DBTech SQL: [-7012] More than one update row not allowed
	at com.sap.dbtech.jdbc.packet.ReplyPacket.createException(ReplyPacket.java:56)
	at com.sap.dbtech.jdbc.ConnectionSapDB.throwSQLError(ConnectionSapDB.java:699)
	at com.sap.dbtech.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:380)
	at com.sap.dbtech.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:278)
	at com.sap.dbtech.jdbc.CallableStatementSapDB.execute(CallableStatementSapDB.java:340)
	at com.sap.dbtech.jdbc.CallableStatementSapDB.execute(CallableStatementSapDB.java:255)
	at com.sap.dbtech.jdbc.CallableStatementSapDB.executeUpdate(CallableStatementSapDB.java:639)
	at UpdateTest.main(UpdateTest.java:54)
Exception in thread "main" Process terminated with exit code 1


Sincerely,
Dirk Z�ttl
--
 _____________________________________________________
|                                                     |
|          tangro software components gmbh            |
|                                                     |
|  dirk zoettl          phone:     +49 6221 13336-0   |
|  czernyring 22/10     fax:       +49 6221 13336-21  |
|  d-69115 heidelberg   email:     [EMAIL PROTECTED]       |
|  germany              internet:  www.tangro.de      |
|_____________________________________________________|

_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to