2015-12-27 36 views
5

Sto utilizzando node-jdbc e il driver oracle "ojdbc6_g.jar" per connettersi a un database Oracle. Voglio eseguire alcune query di inserimento.Come ottenere l'ID generato usando node-jdbc?

Il problema:

Come ottenere generato Id quando si inserisce una riga in Oracle tramite nodo-jdbc?

ho provato a chiamare statement.getGeneratedKeys() ma restituisce il seguente errore nel callback:

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

risposta

5

Ho provato alcune soluzioni e infine sono riuscito a ottenere ROWID della nuova riga inserita. ROWID è una chiave univoca che oracle utilizza per ogni riga di una tabella ed è diversa dall'ID di aumento automatico. In effetti, oracle associa ogni riga a un ROWID univoco.

Avere ROWID possiamo SELEZIONA riga inserita e ottenere ogni colonne di esso.

select * from 'table_name' dove rowid = 'identificativo ottenuto'

per ottenere le chiavi generate dovremmo chiamare statement.executeUpdate() con il parametro "1", in modo che possiamo usare statement.getGeneratedKeys().

Qui è la mia modifica al modulo nodo JDBC per ottenere 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); 
        } 
       } 
      }); 
     } 
    }); 
}; 

risultato è un array di oggetti come:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ] 

augurio È utile.

0

Molte persone fraintendono e utilizzare PreparedStatement # executeUpdate (arg). Documento Java dice Questo metodo con argomento non può essere chiamato su PreparedStatement o CallableStatement. Significa che dobbiamo usare executeUpdate() senza argomenti anche se il metodo executeUpdate (arg) può essere ereditato nella classe PreparedStatement ma non dobbiamo usarlo altrimenti otterremo SQLException.