2015-12-27 6 views
5

私はnode-jdbcとOracleドライバ "ojdbc6_g.jar"を使ってOracleデータベースに接続しています。いくつかの挿入クエリを実行したいと思います。node-jdbcを使用して生成されたIDを取得する方法は?

問題:ノード-JDBCを使用してOracleに行を挿入するときに生成した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にマップします。我々は挿入された行を選択し、それのすべての列を取得することができますROWIDを持つ

。 'TABLE_NAME' ROWID = '得られたROWID'

から選択

*は、我々は、パラメータ"1"statement.executeUpdate()を呼び出す必要があり、キーを生成し得るために、私たちはstatement.getGeneratedKeys()を使用することができます。

はここで、JDBCノードモジュールへの私の変更はROWIDを得ることです:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ] 

は、それが役に立つウィッシュ:

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); 
        } 
       } 
      }); 
     } 
    }); 
}; 

結果のようなオブジェクトの配列です。

0

多くの人が誤解して、PreparedStatement#のexecuteUpdate(引数)を使用します。 Java docはPreparedStatementまたはCallableStatementでこのメソッドを引数として呼び出すことはできないと言っています。 executeUpdate(arg)メソッドはPreparedStatementクラスで継承できますが、使用する必要はありませんが、SQLExceptionを取得する場合でも、executeUpdate()を引数なしで使用する必要があります。

関連する問題