Partilhar via


Sequências Oracle

O Provedor de Dados do .NET Framework para Oracle fornece suporte para recuperar os valores de chave do Oracle Sequence gerados pelo servidor depois de executar inserções usando o OracleDataAdapter.

O SQL Server e o Oracle oferecem suporte à criação de colunas de incremento automático que podem ser designadas como chaves primárias. Esses valores são gerados pelo servidor à medida que as linhas são adicionadas a uma tabela. No SQL Server, você define a propriedade Identity de uma coluna; no Oracle você cria uma sequência. A diferença entre colunas de incremento automático no SQL Server e sequências no Oracle é que:

  • No SQL Server, você marca uma coluna como uma coluna de incremento automático e o SQL Server gera automaticamente novos valores para a coluna quando você insere uma nova linha.
  • No Oracle, você cria uma sequência para gerar novos valores para uma coluna em sua tabela, mas não há nenhum link direto entre a sequência e a tabela ou coluna. Uma sequência Oracle é um objeto, como uma tabela ou um procedimento armazenado.

Ao criar uma sequência em um banco de dados Oracle, você pode definir seu valor inicial e o incremento entre seus valores. Você também pode consultar a sequência para novos valores antes de enviar novas linhas. Isso significa que seu código pode reconhecer os valores de chave para novas linhas antes de inseri-los no banco de dados.

Para obter mais informações sobre como criar colunas de incremento automático usando o SQL Server e o ADO.NET, consulte Recuperando valores de identidade ou de numeração automática e Criando colunas de AutoIncremento.

Exemplo

O exemplo C# a seguir demonstra como você pode recuperar novos valores de sequência do banco de dados Oracle. O exemplo faz referência à INSERT INTO sequência na consulta usada para enviar as novas linhas e, em seguida, retorna o valor da sequência gerada usando a cláusula introduzida RETURNING no Oracle10g. O exemplo adiciona uma série de novas linhas pendentes em um DataTable usando o ADO. Funcionalidade de incremento automático da NET para gerar valores de chave primária de "espaço reservado". Observe que o valor de incremento ADO.NET gerado para a nova linha é apenas um "espaço reservado". Isso significa que o banco de dados pode gerar valores diferentes daqueles que ADO.NET gera.

Antes de enviar as inserções pendentes para o banco de dados, o exemplo exibe o conteúdo das linhas. Em seguida, o código cria um novo OracleDataAdapter objeto e define suas InsertCommand e as UpdateBatchSize propriedades. O exemplo também fornece a lógica para retornar os valores gerados pelo servidor usando parâmetros de saída. Em seguida, o exemplo executa a atualização para enviar as linhas pendentes e exibe o conteúdo do 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();
   }
}

Consulte também