2015-12-27 35 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。

相关问题