diff --git a/builder_oracle.go b/builder_oracle.go index 0047028..9929199 100644 --- a/builder_oracle.go +++ b/builder_oracle.go @@ -184,17 +184,17 @@ func (b *BuilderOracle) BuildExecuteOra(operType string) (sqlStr string, args [] b.IOrm.GetISession().GetIEngin().GetLogger().Error(err.Error()) return } - if where == "" && b.IOrm.GetForce() == false { - err = errors.New("出于安全考虑, update时where条件不能为空, 如果真的不需要where条件, 请使用Force()(如: db.xxx.Force().Update())") - b.IOrm.GetISession().GetIEngin().GetLogger().Error(err.Error()) - return - } - select_sql, multiWhere, update_sql, insert_keys, insert_vals, err := b.BuildReplace(update, where) + select_sql, on_sql, update_sql, insert_keys, insert_vals, err := b.BuildReplace(update, where) if err != nil { return "", nil, err } - sqlStr = fmt.Sprintf("MERGE INTO %s t USING (select %s FROM dual) d on (%s) WHEN matched THEN UPDATE SET%s WHEN NOT matched THEN INSERT (%s) VALUES (%s)", - b.BuildTable(), select_sql, multiWhere, update_sql, insert_keys, insert_vals) + sqlStr = "MERGE INTO " + b.BuildTable() + " t " + sqlStr += "USING (select " + select_sql + " FROM dual) d on (" + on_sql + ") " + if update_sql != "" { + sqlStr += "WHEN matched THEN UPDATE SET " + update_sql + " " + } + sqlStr += "WHEN NOT matched THEN INSERT (" + insert_keys + ") VALUES (" + insert_vals + ")" + //sqlStr = fmt.Sprintf("MERGE INTO %s t USING (select %s FROM dual) d on (%s) WHEN matched THEN UPDATE SET%s WHEN NOT matched THEN INSERT (%s) VALUES (%s)", b.BuildTable(), select_sql, on_sql, update_sql, insert_keys, insert_vals) break } @@ -202,24 +202,26 @@ func (b *BuilderOracle) BuildExecuteOra(operType string) (sqlStr string, args [] return } -func (b *BuilderOracle) BuildReplace(update, where string) (select_sql, multiWhere, update_sql, insert_keys, insert_vals string, err error) { +func (b *BuilderOracle) BuildReplace(update, where string) (select_sql, on_sql, update_sql, insert_keys, insert_vals string, err error) { var reg *regexp.Regexp reg, err = regexp.Compile(`\(([^\)]+)\)`) if err != nil { return } - wheres := reg.FindAllString(where, -1) warr := []string{} + wheres := reg.FindAllString(where, -1) + for i, ws := range wheres { ws = strings.ReplaceAll(ws, "(", "") ws = strings.ReplaceAll(ws, ")", "") if i > 0 { - multiWhere += " and" + on_sql += " and" } warr = append(warr, ws) - multiWhere += " t.\"" + ws + "\"=" + "d.\"" + ws + "\"" + on_sql += " t.\"" + ws + "\"=" + "d.\"" + ws + "\"" } + data1 := strings.Split(update, ",") for i, data := range data1 { data_kv := strings.Split(data, "=") @@ -229,10 +231,17 @@ func (b *BuilderOracle) BuildReplace(update, where string) (select_sql, multiWhe insert_vals += "," } if !inArray(data_kv[0], warr) { - if update_sql != "" && i > 0 { - update_sql += "," + if len(warr) > 0 { + if update_sql != "" && i > 0 { + update_sql += "," + } + update_sql += " t." + b.AddFieldQuotesOracle(data_kv[0]) + "=" + "d." + b.AddFieldQuotesOracle(data_kv[0]) + "" + } else { + if i > 0 { + on_sql += " and" + } + on_sql += " t." + b.AddFieldQuotesOracle(data_kv[0]) + "=" + "d." + b.AddFieldQuotesOracle(data_kv[0]) + "" } - update_sql += " t." + b.AddFieldQuotesOracle(data_kv[0]) + "=" + "d." + b.AddFieldQuotesOracle(data_kv[0]) + "" } insert_keys += b.AddFieldQuotesOracle(data_kv[0]) insert_vals += "d." + b.AddFieldQuotesOracle(data_kv[0]) + ""