2008-12-11 12 views

risposta

28

inserire ... ritorno.

declare 
    s2 number; 
begin 
    insert into seqtest2(x) values ('aaa') returning seq into s2; 
    dbms_output.put_line(s2); 
end; 

"seq" qui si riferisce al nome della colonna di cui si desidera memorizzare il valore nella variabile s2.

in python:

myseq=curs.var(cx_Oracle.NUMBER) 
curs.prepare("insert into seqtest2(x) values('bbb') returning seq into :x") 
curs.execute(None, x=myseq) 
print int(myseq.getvalue()) 
9

Edit: come Mark Harrison ha sottolineato, questo presuppone che si abbia il controllo su come si crea l'id del record inserito. Se si ha il pieno controllo e la responsabilità per esso, questo dovrebbe lavoro ...


utilizzare una stored procedure per eseguire l'inserimento e restituire l'ID.

ad esempio: per una tabella di nomi con ID:

PROCEDURE insert_name(new_name IN names.name%TYPE, 
         new_name_id OUT names.id%TYPE) 
IS 
    new_id names.id%TYPE; 
BEGIN 
    SELECT names_sequence.nextVal INTO new_id FROM dual; 
    INSERT INTO names(id, name) VALUES(new_id, new_name); 
    new_name_id := new_id; 
END; 

Utilizzo di stored procedure per le operazioni CRUD è una buona idea a prescindere se non si sta utilizzando uno strato ORM, in quanto rende il codice più database- agnostico, aiuta contro gli attacchi di iniezione e così via.

6

La mia risposta in C#, considerando che la tabella "testtable" ha una colonna "ID" come PK con una sequenza autoincisa e il campo "testname" è un campo varchar.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Oracle.DataAccess.Client; 
using System.Data; 

namespace ConsoleApplication3 
{ 
class Program 
{ 

    public static void Main(string[] args) 
    { 

     OracleConnection cn = new OracleConnection("your connection string here"); 


     string sql = "INSERT INTO testtable(testname) VALUES('testing2') RETURNING id INTO :LASTID"; 
     OracleParameter lastId = new OracleParameter(":LASTID", OracleDbType.Int32); 

     lastId.Direction = ParameterDirection.Output; 

     using (OracleCommand cmd = new OracleCommand(sql, cn)) 
     { 
      cn.Open(); 
      cmd.Parameters.Add(lastId); 
      cmd.ExecuteNonQuery(); 
      Console.WriteLine("Last ID: " + lastId.Value.ToString()); 
      cn.Close(); 
     } 
     Console.WriteLine(); 
     Console.ReadKey(false); 


    } 
} 
} 
Problemi correlati