2008-12-11 93 views

回答

28

insert ... returns。

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

「seq」這裏指的是你想要存儲到變量s2中的列的名字。

在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

編輯:馬克·哈里森指出,這是假定你有過如何建立您的插入記錄的ID控制。如果你有完全控制權,併爲此負責,這應該工作...


使用存儲過程來執行你的插入和返回的ID。

如:用於地名與IDS表:

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; 

使用存儲過程的CRUD操作是一個好主意,不管,如果你不使用ORM層,因爲它使你的代碼更數據庫 - 不可知論,有助於防止注入攻擊等。

6

我在C#中的答案,考慮到表「testtable」具有「ID」列作爲具有autoinc序列和字段「testname」的PK是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); 


    } 
} 
} 
相關問題