【问题标题】:Oracle: How do I get the sequence number of the row just inserted?Oracle:如何获取刚刚插入的行的序列号?
【发布时间】:2008-12-11 22:49:36
【问题描述】:

如何获取刚刚插入的行的序号?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    插入...返回。

    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())
    

    【讨论】:

      【解决方案2】:

      编辑: 正如 Mark Harrison 所指出的,这假设您可以控制插入记录的 id 的创建方式。如果您对它有完全的控制权和责任,这应该工作......


      使用存储过程执行插入并返回 id。

      例如:对于带有 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;
      

      无论您是否使用 ORM 层,对 CRUD 操作使用存储过程都是一个好主意,因为它使您的代码更加与数据库无关,有助于防止注入攻击等等。

      【讨论】:

        【解决方案3】:

        我在 C# 中的回答,考虑到表“testtable”有一个“ID”列作为带有 autoinc 序列的 PK,而字段“testname”是一个 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);
        
        
            }
        }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-14
          • 1970-01-01
          • 1970-01-01
          • 2014-08-23
          • 2011-07-11
          • 2011-07-31
          • 1970-01-01
          相关资源
          最近更新 更多