2015-12-27 10 views
5

Bir Oracle veritabanına bağlanmak için node-jdbc ve oracle sürücüsü "ojdbc6_g.jar" kullanıyorum. Bazı ekleme sorguları yürütmek istiyorum.node-jdbc kullanılarak nasıl oluşturulur?

sorun: düğüm-jdbc kullanarak oracle içine bir satır eklerken nasıl Kimliği oluşturulan almak için

?

ben statement.getGeneratedKeys() aramaya çalıştım ama geri aramasında aşağıdaki hata verir:

> { [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: {} } 

cevap

5

Bazı çözümleri test ettim ve son olarak yeni eklenen satırın ROWID elde etmeyi başardım. ROWID, oracle'in bir tablonun her satırı için kullandığı ve otomatik inkreament ID'den farklı olan benzersiz bir anahtardır. Aslında, oracle her satırı benzersiz bir ROWID ile eşleştirir.

biz eklenen satır SEÇ ve her sütunları alabilirsiniz ROWID olması. 'Tablo_ismi' rowid = 'elde rowid'

seçin

* biz parametre "1" ile statement.executeUpdate() çağırmalıdır tuşları hazırlanmayacağından için, bu yüzden statement.getGeneratedKeys() kullanabilirsiniz.

İşte jdbc düğüm modülüne benim modifikasyon ROWID elde etmektir:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ] 

yararlı olduğunu dilek:

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

Sonuçların nasıl nesnelerin bir dizidir.

0

Birçok kişi yanlış ve PreparedStatement # executeUpdate (arg) kullanın. Java doc diyor Argümanlı bu yöntem, PreparedStatement veya CallableStatement üzerinde çağrılabilir. ExecuteUpdate (arg) yönteminin PreparedStatement sınıfında miras alınabilmesine rağmen argüman olmadan executeUpdate() yöntemini kullanmamız gerektiği anlamına gelir, aksi takdirde SQLException elde ederiz.