99 */
1010package net .sf .jsqlparser .statement .insert ;
1111
12+ import java .util .Arrays ;
13+ import java .util .Collection ;
14+ import java .util .Iterator ;
15+ import java .util .List ;
16+ import java .util .Optional ;
1217import net .sf .jsqlparser .expression .Alias ;
1318import net .sf .jsqlparser .expression .OracleHint ;
1419import net .sf .jsqlparser .expression .operators .relational .ExpressionList ;
2631import net .sf .jsqlparser .statement .select .WithItem ;
2732import net .sf .jsqlparser .statement .update .UpdateSet ;
2833
29- import java .util .Arrays ;
30- import java .util .Collection ;
31- import java .util .Iterator ;
32- import java .util .List ;
33- import java .util .Optional ;
34-
3534@ SuppressWarnings ({"PMD.CyclomaticComplexity" })
3635public class Insert implements Statement {
3736
@@ -55,6 +54,9 @@ public class Insert implements Statement {
5554 private InsertConflictAction conflictAction ;
5655 private InsertDuplicateAction duplicateAction ;
5756 private Alias rowAlias ;
57+ private boolean oracleMultiInsert = false ;
58+ private boolean oracleMultiInsertFirst = false ;
59+ private List <OracleMultiInsertBranch > oracleMultiInsertBranches ;
5860
5961 public List <UpdateSet > getDuplicateUpdateSets () {
6062 if (duplicateAction != null ) {
@@ -97,6 +99,12 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
9799 }
98100
99101 public Table getTable () {
102+ if (table == null && oracleMultiInsertBranches != null
103+ && !oracleMultiInsertBranches .isEmpty ()
104+ && oracleMultiInsertBranches .get (0 ).getClauses () != null
105+ && !oracleMultiInsertBranches .get (0 ).getClauses ().isEmpty ()) {
106+ return oracleMultiInsertBranches .get (0 ).getClauses ().get (0 ).getTable ();
107+ }
100108 return table ;
101109 }
102110
@@ -270,10 +278,46 @@ public Insert withConflictAction(InsertConflictAction conflictAction) {
270278 return this ;
271279 }
272280
281+ public boolean isOracleMultiInsert () {
282+ return oracleMultiInsert ;
283+ }
284+
285+ public void setOracleMultiInsert (boolean oracleMultiInsert ) {
286+ this .oracleMultiInsert = oracleMultiInsert ;
287+ }
288+
289+ public boolean isOracleMultiInsertFirst () {
290+ return oracleMultiInsertFirst ;
291+ }
292+
293+ public void setOracleMultiInsertFirst (boolean oracleMultiInsertFirst ) {
294+ this .oracleMultiInsertFirst = oracleMultiInsertFirst ;
295+ }
296+
297+ public List <OracleMultiInsertBranch > getOracleMultiInsertBranches () {
298+ return oracleMultiInsertBranches ;
299+ }
300+
301+ public void setOracleMultiInsertBranches (
302+ List <OracleMultiInsertBranch > oracleMultiInsertBranches ) {
303+ this .oracleMultiInsertBranches = oracleMultiInsertBranches ;
304+ }
305+
273306 @ Override
274307 @ SuppressWarnings ({"PMD.CyclomaticComplexity" , "PMD.NPathComplexity" })
275308 public String toString () {
276309 StringBuilder sql = new StringBuilder ();
310+ appendWithItems (sql );
311+ appendInsertPrefix (sql );
312+ if (appendOracleMultiInsert (sql )) {
313+ return sql .toString ();
314+ }
315+ appendInsertTargetAndValues (sql );
316+ appendInsertActions (sql );
317+ return sql .toString ();
318+ }
319+
320+ private void appendWithItems (StringBuilder sql ) {
277321 if (withItemsList != null && !withItemsList .isEmpty ()) {
278322 sql .append ("WITH " );
279323 for (Iterator <WithItem <?>> iter = withItemsList .iterator (); iter .hasNext ();) {
@@ -285,6 +329,9 @@ public String toString() {
285329 sql .append (" " );
286330 }
287331 }
332+ }
333+
334+ private void appendInsertPrefix (StringBuilder sql ) {
288335 sql .append ("INSERT " );
289336 if (oracleHint != null ) {
290337 sql .append (oracleHint ).append (" " );
@@ -295,6 +342,26 @@ public String toString() {
295342 if (modifierIgnore ) {
296343 sql .append ("IGNORE " );
297344 }
345+ }
346+
347+ private boolean appendOracleMultiInsert (StringBuilder sql ) {
348+ if (!oracleMultiInsert ) {
349+ return false ;
350+ }
351+
352+ sql .append (oracleMultiInsertFirst ? "FIRST" : "ALL" );
353+ if (oracleMultiInsertBranches != null && !oracleMultiInsertBranches .isEmpty ()) {
354+ for (OracleMultiInsertBranch branch : oracleMultiInsertBranches ) {
355+ appendOracleMultiInsertBranch (sql , branch );
356+ }
357+ }
358+ if (select != null ) {
359+ sql .append (" " ).append (select );
360+ }
361+ return true ;
362+ }
363+
364+ private void appendInsertTargetAndValues (StringBuilder sql ) {
298365 if (overwrite ) {
299366 sql .append ("OVERWRITE " );
300367 } else {
@@ -338,10 +405,12 @@ public String toString() {
338405 if (select != null ) {
339406 sql .append (select );
340407 }
408+ }
341409
410+ private void appendInsertActions (StringBuilder sql ) {
342411 if (setUpdateSets != null && !setUpdateSets .isEmpty ()) {
343412 sql .append ("SET " );
344- sql = UpdateSet .appendUpdateSetsTo (sql , setUpdateSets );
413+ UpdateSet .appendUpdateSetsTo (sql , setUpdateSets );
345414 if (rowAlias != null ) {
346415 sql .append (" " ).append (rowAlias );
347416 }
@@ -364,8 +433,6 @@ public String toString() {
364433 if (returningClause != null ) {
365434 returningClause .appendTo (sql );
366435 }
367-
368- return sql .toString ();
369436 }
370437
371438 public Insert withWithItemsList (List <WithItem <?>> withList ) {
@@ -424,4 +491,37 @@ public Alias getRowAlias() {
424491 public void setRowAlias (Alias rowAlias ) {
425492 this .rowAlias = rowAlias ;
426493 }
494+
495+ public Insert withOracleMultiInsert (boolean oracleMultiInsert ) {
496+ this .setOracleMultiInsert (oracleMultiInsert );
497+ return this ;
498+ }
499+
500+ public Insert withOracleMultiInsertFirst (boolean oracleMultiInsertFirst ) {
501+ this .setOracleMultiInsertFirst (oracleMultiInsertFirst );
502+ return this ;
503+ }
504+
505+ public Insert withOracleMultiInsertBranches (
506+ List <OracleMultiInsertBranch > oracleMultiInsertBranches ) {
507+ this .setOracleMultiInsertBranches (oracleMultiInsertBranches );
508+ return this ;
509+ }
510+
511+ private void appendOracleMultiInsertBranch (StringBuilder sql ,
512+ OracleMultiInsertBranch branch ) {
513+ if (branch == null || branch .getClauses () == null || branch .getClauses ().isEmpty ()) {
514+ return ;
515+ }
516+
517+ if (branch .getWhenExpression () != null ) {
518+ sql .append (" WHEN " ).append (branch .getWhenExpression ()).append (" THEN" );
519+ } else if (branch .isElseClause ()) {
520+ sql .append (" ELSE" );
521+ }
522+
523+ for (OracleMultiInsertClause clause : branch .getClauses ()) {
524+ sql .append (" " ).append (clause );
525+ }
526+ }
427527}
0 commit comments