Oracle 序列

用于 Oracle 的 .NET Framework 数据提供程序支持在使用 OracleDataAdapter 执行插入后检索服务器生成的 Oracle 序列键值。

SQL Server 和 Oracle 支持创建可指派为主键的自动递增列。 在向表中添加行时,服务器会生成这些值。 在 SQL Server 中,您可以设置列的标识属性;在 Oracle 中,您可以创建一个序列。 SQL Server 中自动递增列和 Oracle 中序列的区别是:

  • 在 SQL Server 中,将某列标记为自动递增列,SQL Server 会在您插入新行时为该列自动生成新值。
  • 在 Oracle 中,您创建一个序列以便为表中的列生成新值,但序列和表或列之间不存在直接链接。 Oracle 序列是一个类似表或存储过程的对象。

在 Oracle 数据库中创建序列时,您可以定义其初始值以及值之间的增量。 在提交新行之前,您也可以查询序列中的新值。 这意味着在你将新行插入数据库之前,代码可识别新行的键值。

若要详细了解如何通过使用 SQL Server 和 ADO.NET 来创建自动递增列,请参阅检索标识或自动编号值创建自动增量列

示例

下面的 C# 示例演示如何从 Oracle 数据库检索新序列值。 此示例引用用于提交新行的 INSERT INTO 查询中的序列,然后返回使用 Oracle10g 中引入的 RETURNING 子句生成的序列值。 此示例可使用 ADO.NET 自动递增功能在 DataTable 中添加一系列挂起的新行,以生成“占位符”主键值。 注意:ADO.NET 为新行生成的增量值仅是一个“占位符”。 这意味着数据库生成的值可能与 ADO.NET 生成的值不同。

在将挂起的插入行提交给数据库之前,此示例显示行的内容。 然后,代码将创建一个新的 OracleDataAdapter 对象并设置其 InsertCommandUpdateBatchSize 属性。 此示例还提供使用输出参数返回服务器生成的值的逻辑。 然后,此示例将执行更新以提交挂起的行并显示 DataTable 的内容。

public void OracleSequence(String connectionString)
{
   String insertString =
      "INSERT INTO SequenceTest_Table (ID, OtherColumn)" +
      "VALUES (SequenceTest_Sequence.NEXTVAL, :OtherColumn)" +
      "RETURNING ID INTO :ID";

   using (OracleConnection conn = new OracleConnection(connectionString))
   {
      //Open a connection.
      conn.Open();
      OracleCommand cmd = conn.CreateCommand();

      // Prepare the database.
      cmd.CommandText = "DROP SEQUENCE SequenceTest_Sequence";
      try { cmd.ExecuteNonQuery(); } catch { }

      cmd.CommandText = "DROP TABLE SequenceTest_Table";
      try { cmd.ExecuteNonQuery(); } catch { }

      cmd.CommandText = "CREATE TABLE SequenceTest_Table " +
                     "(ID int PRIMARY KEY, OtherColumn varchar(255))";
      cmd.ExecuteNonQuery();

      cmd.CommandText = "CREATE SEQUENCE SequenceTest_Sequence " +
                        "START WITH 100 INCREMENT BY 5";
      cmd.ExecuteNonQuery();

      DataTable testTable = new DataTable();
      DataColumn column = testTable.Columns.Add("ID", typeof(int));
      column.AutoIncrement = true;
      column.AutoIncrementSeed = -1;
      column.AutoIncrementStep = -1;
      testTable.PrimaryKey = new DataColumn[] { column };
      testTable.Columns.Add("OtherColumn", typeof(string));
      for (int rowCounter = 1; rowCounter <= 15; rowCounter++)
      {
         testTable.Rows.Add(null, "Row #" + rowCounter.ToString());
      }

      Console.WriteLine("Before Update => ");
      foreach (DataRow row in testTable.Rows)
      {
         Console.WriteLine("   {0} - {1}", row["ID"], row["OtherColumn"]);
      }
      Console.WriteLine();

      cmd.CommandText =
        "SELECT ID, OtherColumn FROM SequenceTest_Table";
      OracleDataAdapter da = new OracleDataAdapter(cmd);
      da.InsertCommand = new OracleCommand(insertString, conn);
      da.InsertCommand.Parameters.Add(":ID", OracleType.Int32, 0, "ID");
      da.InsertCommand.Parameters[0].Direction = ParameterDirection.Output;
      da.InsertCommand.Parameters.Add(":OtherColumn", OracleType.VarChar, 255, "OtherColumn");
      da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
      da.UpdateBatchSize = 10;

      da.Update(testTable);

      Console.WriteLine("After Update => ");
      foreach (DataRow row in testTable.Rows)
      {
         Console.WriteLine("   {0} - {1}", row["ID"], row["OtherColumn"]);
      }
      // Close the connection.
      conn.Close();
   }
}

请参阅