JDBC

2013-10-17 8 views
10

के माध्यम से पुन: प्राप्त एडब्ल्यूएस Redshift से डाला पहचान मूल्य एडब्ल्यूएस Redshift के साथ काम करने JDBC ड्राइवर के माध्यम से मेरा ध्यान एक पहचान स्तंभ के साथ एक मेज से पिछले डाला आईडी प्राप्त करने के लिए आ गया है जबकि निम्न विधियों में से किसी के साथ पूरा नहीं किया जा सकता है:JDBC

RETURNING key word 

या

Statement.RETURN_GENERATED_KEYS 

स्टैक ओवरफ़्लो प्रविष्टि में उल्लिखित:

How to get a value from the last inserted row?

उपरोक्त विधियां Redshift (10/17/2013 के रूप में) के रूप में उपलब्ध नहीं हैं PostgreSQL संस्करण 8.0.2 पर बनाई गई हैं। नीचे दिए गए लिंक में निम्नलिखित दस्तावेज़ देखें:

http://docs.aws.amazon.com/redshift/latest/dg/c_redshift-and-postgres-sql.html

:

http://docs.aws.amazon.com/redshift/latest/dg/c_high_level_system_architecture.html

आप एक RDBMS के रूप में Redshift उपयोग करने के लिए इच्छुक रहे हैं, तो यह रूप में अच्छी तरह निम्नलिखित को पढ़ने के लिए एक सार्थक प्रयास है प्रश्न:

के माध्यम से Redshift में ऑटो-वृद्धि/सीरियल/पहचान कॉलम पर अंतिम डाली गई आईडी को पुनर्प्राप्त करने के लिए सबसे अच्छी रणनीति क्या हैPostgreSQL जेडीबीसी चालक?

उत्तर

4

देखते हुए Redshift इंजन PostgreSQL 8.0.2 और बाद के संस्करण पर बनाया गया है लौटने और Statement.RETURN_GENERATED_KEYS विकल्पों उपलब्ध नहीं हैं और Redshift CURRVAL/NEXTVAL समारोह सूट के उपयोग के लिए अनुक्रम बनाते समर्थन नहीं करता है, एक विकल्प होगा एक जेडीबीसी लेनदेन में समूह दो एसक्यूएल स्टेटमेंट्स, आईएनएसईआरटी और चयन MAX ([पहचान कॉलम])।

try { 

    // create the JDBC connection 
    Class.forName(JDBC_DRIVER); 
    Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); 

    // start the transaction 
    conn.setAutoCommit(false); 
    // create the prepared statement for insert 
    PreparedStatement prpd = conn.prepareStatement(SQL_INSERT_STATEMENT); 

    // set input/output parameters as needed... 

    // execute the SQL prepared statement 
    int j = prpd.executeUpdate(); 

    // create a statement for select max() 
    Statement stmt = conn.createStatement(); 
    // execute the statement to return a result set   
    ResultSet key = stmt.executeQuery(SQL_SELECT_MAX_STATEMENT); 

    // initialize and retrieve the incremented identity value, in this case it is a long (bigint data type in Redshift) 
    long id = 0; 
    if (key.next()) { 
     id = key.getLong(1); 
    } 

    // commit the entire transaction   
    conn.commit(); 

} catch (SQLException se) { 
    // if an SQL exception occurs, rollback the whole deal 
    try { 
     if (conn!=null && !conn.isClosed()) { 
      conn.rollback(); 
     } 

    } catch (Exception e) { 

    } 
} catch (Exception e) { 
    // roll back if something other than an SQLException occurs 
    try { 
     if (conn!=null && !conn.isClosed()) { 
      conn.rollback(); 
     } 
    } catch (Exception e) { 

    } 
} finally { 
    // do whatever you want to return a value, shut down resources 
    // close out JDBC resources 
    try { 
     if (conn!=null && !conn.isClosed()) { 
      conn.setAutoCommit(true); 
     }     
    } catch (SQLException se) { 

    } 

    try {     
     if (prpd!=null && !prpd.isClosed()) { 
      prpd.close(); 
     }         
    } catch (SQLException se) { 

    } 

    try {     
     if (stmt!=null && !stmt.isClosed()) { 
      stmt.close(); 
     }         
    } catch (SQLException se) { 

    } 

    try { 
     if (conn!=null && !conn.isClosed()) { 
      conn.close(); 
     } 
    } catch (SQLException se) { 

    } 
} 

उपरोक्त काम करेगा यदि SQL_INSERT_STATEMENT एक तालिका को लिखता/ताला लगाता है। कई टेबल लॉक को डेडलॉक से बचाने के लिए सिंक्रनाइज़ कीवर्ड की आवश्यकता होगी। लॉक की गई तालिका पर चयन करने से वृद्धि हुई पहचान मान को परिणामसेट में लौटा दिया जाएगा।