Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[oracle 12+] Test native identity support in bulk copy #3245

Merged
merged 3 commits into from
Oct 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 10 additions & 4 deletions Source/LinqToDB/DataProvider/Oracle/OracleBulkCopy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,7 @@ static BulkCopyRowsCopied OracleMultipleRowsCopy2(MultipleRowsHelper helper, IEn
}

if (helper.CurrentCount > 0)
{
Execute(helper, list);
}

return helper.RowsCopied;
}
Expand Down Expand Up @@ -353,7 +351,11 @@ static bool Execute(MultipleRowsHelper helper, List<object> list)
? helper.MappingSchema.GetDataType(column.MemberType).Type.DataType
: column.DataType;

helper.Parameters.Add(new DataParameter(":p" + (i + 1), list.Select(o => column.GetValue(o)).ToArray(), dataType, column.DbType)
var value = new object?[list.Count];
for (var j = 0; j < value.Length; j++)
value[j] = column.GetValue(list[j]);

helper.Parameters.Add(new DataParameter(":p" + (i + 1), value, dataType, column.DbType)
{
Direction = ParameterDirection.Input,
IsArray = true,
Expand All @@ -372,7 +374,11 @@ static Task<bool> ExecuteAsync(MultipleRowsHelper helper, List<object> list, Can
? helper.MappingSchema.GetDataType(column.MemberType).Type.DataType
: column.DataType;

helper.Parameters.Add(new DataParameter(":p" + (i + 1), list.Select(o => column.GetValue(o)).ToArray(), dataType, column.DbType)
var value = new object?[list.Count];
for (var j = 0; j < value.Length; j++)
value[j] = column.GetValue(list[j]);

helper.Parameters.Add(new DataParameter(":p" + (i + 1), value, dataType, column.DbType)
{
Direction = ParameterDirection.Input,
IsArray = true,
Expand Down
45 changes: 40 additions & 5 deletions Source/LinqToDB/DataProvider/Oracle/OracleTools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,48 @@ namespace LinqToDB.DataProvider.Oracle
using Configuration;
using Data;

/// <summary>
/// Defines type of multi-row INSERT operation to generate for <see cref="BulkCopyType.RowByRow"/> bulk copy mode.
/// </summary>
public enum AlternativeBulkCopy
{
/// <summary>
/// This mode generates INSERT ALL statement.
/// Note that INSERT ALL doesn't support sequences and will use single generated value for all rows.
/// <code>
/// INSERT ALL
/// INTO target_table VALUES(/*row data*/)
/// ...
/// INTO target_table VALUES(/*row data*/)
/// </code>
/// </summary>
InsertAll,
/// <summary>
/// This mode performs regular INSERT INTO query with array of values for each column.
/// <code>
/// INSERT INTO target_table(/*columns*/)
/// VALUES(:column1ArrayParameter, ..., :columnXArrayParameter)
/// </code>
/// </summary>
InsertInto,
/// <summary>
/// This mode generates INSERT ... SELECT statement.
/// <code>
/// INSERT INTO target_table(/*columns*/)
/// SELECT /*row data*/ FROM DUAL
/// UNION ALL
/// ...
/// UNION ALL
/// SELECT /*row data*/ FROM DUAL
/// </code>
/// </summary>
InsertDual
}

public static partial class OracleTools
{
#if NETFRAMEWORK
private static readonly Lazy<IDataProvider> _oracleNativeDataProvider11 = new Lazy<IDataProvider>(() =>
private static readonly Lazy<IDataProvider> _oracleNativeDataProvider11 = new (() =>
{
var provider = new OracleDataProvider(ProviderName.OracleNative, OracleVersion.v11);

Expand All @@ -29,7 +60,7 @@ public static partial class OracleTools
return provider;
}, true);

private static readonly Lazy<IDataProvider> _oracleNativeDataProvider12 = new Lazy<IDataProvider>(() =>
private static readonly Lazy<IDataProvider> _oracleNativeDataProvider12 = new (() =>
{
var provider = new OracleDataProvider(ProviderName.OracleNative, OracleVersion.v12);

Expand All @@ -39,7 +70,7 @@ public static partial class OracleTools
}, true);
#endif

private static readonly Lazy<IDataProvider> _oracleManagedDataProvider11 = new Lazy<IDataProvider>(() =>
private static readonly Lazy<IDataProvider> _oracleManagedDataProvider11 = new (() =>
{
var provider = new OracleDataProvider(ProviderName.OracleManaged, OracleVersion.v11);

Expand All @@ -48,7 +79,7 @@ public static partial class OracleTools
return provider;
}, true);

private static readonly Lazy<IDataProvider> _oracleManagedDataProvider12 = new Lazy<IDataProvider>(() =>
private static readonly Lazy<IDataProvider> _oracleManagedDataProvider12 = new (() =>
{
var provider = new OracleDataProvider(ProviderName.OracleManaged, OracleVersion.v12);

Expand Down Expand Up @@ -301,8 +332,12 @@ public static DataConnection CreateDataConnection(IDbTransaction transaction, st
}, source);
}

#endregion
#endregion

/// <summary>
/// Specifies type of multi-row INSERT operation to generate for <see cref="BulkCopyType.RowByRow"/> bulk copy mode.
/// Default value: <see cref="AlternativeBulkCopy.InsertAll"/>.
/// </summary>
public static AlternativeBulkCopy UseAlternativeBulkCopy = AlternativeBulkCopy.InsertAll;

[Obsolete("This field is not used by linq2db. Configure reader expressions on DataProvider directly")]
Expand Down