OracleInsertBuilder.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public class OracleInsertBuilder : InsertBuilder
  9. {
  10. public override string SqlTemplate
  11. {
  12. get
  13. {
  14. return @"INSERT INTO {0}
  15. ({1})
  16. VALUES
  17. ({2}) ";
  18. }
  19. }
  20. public override string SqlTemplateBatch
  21. {
  22. get
  23. {
  24. return "INSERT INTO {0} ({1})";
  25. }
  26. }
  27. public override string ToSqlString()
  28. {
  29. var identities = this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).ToList();
  30. if (IsNoInsertNull)
  31. {
  32. DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
  33. }
  34. if (this.Context.CurrentConnectionConfig?.MoreSettings?.EnableOracleIdentity == true)
  35. {
  36. this.DbColumnInfoList = this.DbColumnInfoList.Where(it => it.IsIdentity == false).ToList();
  37. }
  38. var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
  39. var isSingle = groupList.Count() == 1;
  40. string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
  41. if (isSingle && this.EntityInfo.EntityName != "Dictionary`2")
  42. {
  43. string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it => base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName)));
  44. if (identities.HasValue())
  45. {
  46. columnsString = columnsString.TrimEnd(',') + "," + string.Join(",", identities.Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
  47. columnParametersString = columnParametersString.TrimEnd(',') + "," + string.Join(",", identities.Select(it => it.OracleSequenceName + ".nextval"));
  48. }
  49. ActionMinDate();
  50. return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString);
  51. }
  52. else
  53. {
  54. var bigSize = 500;
  55. if (groupList.Count < bigSize||this.Context?.CurrentConnectionConfig?.MoreSettings?.EnableOracleIdentity==true)
  56. {
  57. string result = Small(identities, groupList, columnsString);
  58. return result;
  59. }
  60. else
  61. {
  62. string result = Big(identities, groupList, columnsString);
  63. return result;
  64. }
  65. }
  66. }
  67. private string Big(List<EntityColumnInfo> identities, List<IGrouping<int, DbColumnInfo>> groupList, string columnsString)
  68. {
  69. this.Context.Utilities.PageEach(groupList, 100, groupListPasge =>
  70. {
  71. this.Parameters = new List<SugarParameter>();
  72. var sql = Small(identities, groupListPasge, columnsString);
  73. this.Context.Ado.ExecuteCommand(sql, this.Parameters);
  74. });
  75. if (identities != null && identities.Count > 0 && this.OracleSeqInfoList != null && this.OracleSeqInfoList.Any())
  76. {
  77. return $"SELECT {this.OracleSeqInfoList.First().Value - 1} FROM DUAL";
  78. }
  79. else
  80. {
  81. return $"SELECT {groupList.Count} FROM DUAL";
  82. }
  83. }
  84. private string Small(List<EntityColumnInfo> identities, List<IGrouping<int, DbColumnInfo>> groupList, string columnsString)
  85. {
  86. StringBuilder batchInsetrSql = new StringBuilder();
  87. batchInsetrSql.AppendLine("INSERT ALL");
  88. foreach (var item in groupList)
  89. {
  90. batchInsetrSql.Append("INTO " + GetTableNameString + " ");
  91. string insertColumns = "";
  92. batchInsetrSql.Append("(");
  93. batchInsetrSql.Append(columnsString);
  94. if (identities.HasValue()&& this.IsOffIdentity==false)
  95. {
  96. batchInsetrSql.Append("," + string.Join(",", identities.Select(it => Builder.GetTranslationColumnName(it.DbColumnName))));
  97. }
  98. batchInsetrSql.Append(") VALUES");
  99. batchInsetrSql.Append("(");
  100. insertColumns = string.Join(",", item.Select(it => GetDbColumn(it, FormatValue(it.Value, it.PropertyName))));
  101. batchInsetrSql.Append(insertColumns);
  102. if (this.IsOffIdentity == false)
  103. {
  104. if (identities.HasValue())
  105. {
  106. batchInsetrSql.Append(",");
  107. foreach (var idn in identities)
  108. {
  109. var seqvalue = this.OracleSeqInfoList[idn.OracleSequenceName];
  110. this.OracleSeqInfoList[idn.OracleSequenceName] = this.OracleSeqInfoList[idn.OracleSequenceName] + 1;
  111. if (identities.Last() == idn)
  112. {
  113. batchInsetrSql.Append(seqvalue);
  114. }
  115. else
  116. {
  117. batchInsetrSql.Append(seqvalue + ",");
  118. }
  119. }
  120. }
  121. }
  122. batchInsetrSql.AppendLine(") ");
  123. }
  124. if (identities.HasValue())
  125. {
  126. batchInsetrSql.AppendLine("SELECT " + (this.OracleSeqInfoList.First().Value - 1) + " FROM DUAL");
  127. }
  128. else
  129. {
  130. batchInsetrSql.AppendLine("SELECT 1 FROM DUAL");
  131. }
  132. var result = batchInsetrSql.ToString();
  133. return result;
  134. }
  135. int i = 0;
  136. public object FormatValue(object value, string name)
  137. {
  138. if (value == null)
  139. {
  140. return "NULL";
  141. }
  142. else
  143. {
  144. string N = this.Context.GetN();
  145. var type = UtilMethods.GetUnderType(value.GetType());
  146. if (type == UtilConstants.StringType && value.ToString().Contains("{SugarSeq:=}"))
  147. {
  148. return value.ToString().Replace("{SugarSeq:=}", "");
  149. }
  150. if (type == UtilConstants.DateType)
  151. {
  152. var date = value.ObjToDate();
  153. if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
  154. {
  155. date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  156. }
  157. if (this.Context.CurrentConnectionConfig?.MoreSettings?.DisableMillisecond == true)
  158. {
  159. return "to_date('" + date.ToString("yyyy-MM-dd HH:mm:ss") + "', 'YYYY-MM-DD HH24:MI:SS') ";
  160. }
  161. else
  162. {
  163. return "to_timestamp('" + date.ToString("yyyy-MM-dd HH:mm:ss.ffffff") + "', 'YYYY-MM-DD HH24:MI:SS.FF') ";
  164. }
  165. }
  166. else if (type.IsEnum())
  167. {
  168. return Convert.ToInt64(value);
  169. }
  170. else if (type == UtilConstants.ByteArrayType)
  171. {
  172. ++i;
  173. var parameterName = this.Builder.SqlParameterKeyWord + name + i;
  174. this.Parameters.Add(new SugarParameter(parameterName, value, System.Data.DbType.Binary));
  175. return parameterName;
  176. }
  177. else if (type == UtilConstants.BoolType)
  178. {
  179. return value.ObjToBool() ? "1" : "0";
  180. }
  181. else if (type == UtilConstants.DateTimeOffsetType)
  182. {
  183. var date = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
  184. return "to_timestamp('" + date.ToString("yyyy-MM-dd HH:mm:ss.ffffff") + "', 'YYYY-MM-DD HH24:MI:SS.FF') ";
  185. }
  186. else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
  187. {
  188. if (value.ToString().Length > 1000)
  189. {
  190. ++i;
  191. var parameterName = this.Builder.SqlParameterKeyWord + name + i;
  192. this.Parameters.Add(new SugarParameter(parameterName, value));
  193. return parameterName;
  194. }
  195. else
  196. {
  197. return N + "'" + value.ToString().ToSqlFilter() + "'";
  198. }
  199. }
  200. else
  201. {
  202. return N + "'" + value.ToString() + "'";
  203. }
  204. }
  205. }
  206. }
  207. }