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