2015-12-27 34 views
5

我使用node-jdbc和oracle驅動程序「ojdbc6_g.jar」連接到Oracle數據庫。我想執行一些插入查詢。如何使用node-jdbc獲取生成的ID?

問題:

如何使用節點JDBC插入一個行甲骨文時候才能生成的ID?

席力圖召statement.getGeneratedKeys()但在回調返回以下錯誤:

> { [Error: Error running instance method java.sql.SQLException: 
> operation not allowed 
>   at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:8425) 
>   at oracle.jdbc.driver.OracleStatementWrapper.getGeneratedKeys(OracleStatementWrapper.java:1106) 
>   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
>   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
>   at java.lang.reflect.Method.invoke(Method.java:483) ] cause: {} } 

回答

5

我測試了一些解決方案,最後我設法得到了新插入行的ROWID。 ROWID是Oracle用於表的每一行並且與自動增量ID不同的唯一鍵。實際上,oracle將每一行映射到一個唯一的ROWID。我們可以選擇插入的行,並得到它的每一列。

SELECT * FROM '表名',其中的ROWID = '獲得的rowid'

若要生成密鑰,我們應該叫statement.executeUpdate()與參數「1」,所以我們可以使用statement.getGeneratedKeys()

這是我修改jdbc節點模塊獲得ROWID:

JDBCConn.prototype.executeInsert = function (sql, callback, getGeneratedKeys) { 
    var self = this; 

    self._conn.createStatement(function (err, statement) { 
     if (err) { 
      return callback(err); 
     } 
     else { 
      // calling `statement.executeUpdate()` with parameter 1 
      statement.executeUpdate(sql, 1, function (err, rowcount) { 
       if (err) { 
        return callback(err); 
       } 
       else { 
        if (getGeneratedKeys) { 
         statement.getGeneratedKeys(function (err, resultset) { 
          resultset.getMetaData(function (err, rsmd) { 
           if (err) { 
            return callback(err); 
           } else { 
            var results = []; 
            var cc = rsmd.getColumnCountSync(); 
            var columns = ['']; 
            for (var i = 1; i <= cc; i++) { 
             var colname = rsmd.getColumnNameSync(i); 
             columns.push(colname); 
            } 
            var next = resultset.nextSync(); 
            var processRow = function (next) { 
             if (next) { 
              setImmediate(function() { 
               var row = {}; 
               for (var a = 1; a <= cc; a++) { 
                row[columns[a]] = trim1(resultset.getStringSync(a)); 
               } 
               results.push(row); 
               next = resultset.nextSync(); 
               processRow(next); 
              }); 
             } else { 
              callback(null, rowcount, results); 
             } 
            }; 
            processRow(next); 
           } 
          }); 
         }); 
        } 
        else { 
         callback(null, rowcount); 
        } 
       } 
      }); 
     } 
    }); 
}; 

結果是物體的像一個數組:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ] 

希望它是有幫助的。

0

很多人誤解和利用PreparedStatement#的executeUpdate(ARG)。 Java doc說這個帶參數的方法不能在PreparedStatement或CallableStatement上調用。這意味着即使executeUpdate(arg)方法可以在PreparedStatement類中繼承,但我們不必使用它,否則我們必須使用不帶參數的executeUpdate(),否則我們將獲得SQLException。

相關問題