001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 005 006/** 007 * Oracle 26 FOR LOOP iteration control. 008 * Represents a single iteration control in a FOR LOOP, supporting: 009 * - Range iteration: lower_bound..upper_bound [BY step] 010 * - REVERSE range iteration: REVERSE lower_bound..upper_bound [BY step] 011 * - VALUES OF collection 012 * - INDICES OF collection 013 * - EXECUTE IMMEDIATE dynamic SQL 014 * - REPEAT single expression control 015 * 016 * Multiple iteration controls can be combined in a single FOR LOOP: 017 * FOR i IN 1..3, REVERSE i+1..i+10, 51..55 LOOP ... END LOOP; 018 */ 019public class TIterationControl extends TParseTreeNode { 020 021 public static final int RANGE = 1; 022 public static final int VALUES_OF = 2; 023 public static final int INDICES_OF = 3; 024 public static final int EXECUTE_IMMEDIATE = 4; 025 public static final int REPEAT_EXPR = 5; 026 public static final int CURSOR = 6; 027 public static final int SINGLE_EXPR = 7; 028 public static final int PAIRS_OF = 8; 029 030 private int controlType = RANGE; 031 private boolean isReverse = false; 032 033 // For range iteration: lower_bound..upper_bound 034 private TExpression lowerBound; 035 private TExpression upperBound; 036 037 // For BY step clause 038 private TExpression stepExpression; 039 040 // For VALUES OF / INDICES OF collection reference 041 private TObjectName collectionRef; 042 043 // For EXECUTE IMMEDIATE 044 private TExpression executeExpr; 045 private TExpressionList executeUsingVars; 046 047 // For REPEAT single expression 048 private TExpression repeatExpr; 049 050 // For WHILE/WHEN predicates on this specific iteration control 051 private TExpression whilePredicate; 052 private TExpression whenPredicate; 053 054 // For cursor FOR LOOP 055 private TSelectSqlStatement subquery; 056 private TObjectName cursorName; 057 private TExpressionList cursorParameterNames; 058 059 public TIterationControl() { 060 } 061 062 public void init(Object arg1) { 063 // Used for simple initializations 064 } 065 066 public int getControlType() { 067 return controlType; 068 } 069 070 public void setControlType(int controlType) { 071 this.controlType = controlType; 072 } 073 074 public boolean isReverse() { 075 return isReverse; 076 } 077 078 public void setReverse(boolean reverse) { 079 isReverse = reverse; 080 } 081 082 public TExpression getLowerBound() { 083 return lowerBound; 084 } 085 086 public void setLowerBound(TExpression lowerBound) { 087 this.lowerBound = lowerBound; 088 } 089 090 public TExpression getUpperBound() { 091 return upperBound; 092 } 093 094 public void setUpperBound(TExpression upperBound) { 095 this.upperBound = upperBound; 096 } 097 098 public TExpression getStepExpression() { 099 return stepExpression; 100 } 101 102 public void setStepExpression(TExpression stepExpression) { 103 this.stepExpression = stepExpression; 104 } 105 106 public TObjectName getCollectionRef() { 107 return collectionRef; 108 } 109 110 public void setCollectionRef(TObjectName collectionRef) { 111 this.collectionRef = collectionRef; 112 } 113 114 public TExpression getExecuteExpr() { 115 return executeExpr; 116 } 117 118 public void setExecuteExpr(TExpression executeExpr) { 119 this.executeExpr = executeExpr; 120 } 121 122 public TExpressionList getExecuteUsingVars() { 123 return executeUsingVars; 124 } 125 126 public void setExecuteUsingVars(TExpressionList executeUsingVars) { 127 this.executeUsingVars = executeUsingVars; 128 } 129 130 public TExpression getRepeatExpr() { 131 return repeatExpr; 132 } 133 134 public void setRepeatExpr(TExpression repeatExpr) { 135 this.repeatExpr = repeatExpr; 136 } 137 138 public TExpression getWhilePredicate() { 139 return whilePredicate; 140 } 141 142 public void setWhilePredicate(TExpression whilePredicate) { 143 this.whilePredicate = whilePredicate; 144 } 145 146 public TExpression getWhenPredicate() { 147 return whenPredicate; 148 } 149 150 public void setWhenPredicate(TExpression whenPredicate) { 151 this.whenPredicate = whenPredicate; 152 } 153 154 public TSelectSqlStatement getSubquery() { 155 return subquery; 156 } 157 158 public void setSubquery(TSelectSqlStatement subquery) { 159 this.subquery = subquery; 160 } 161 162 public TObjectName getCursorName() { 163 return cursorName; 164 } 165 166 public void setCursorName(TObjectName cursorName) { 167 this.cursorName = cursorName; 168 } 169 170 public TExpressionList getCursorParameterNames() { 171 return cursorParameterNames; 172 } 173 174 public void setCursorParameterNames(TExpressionList cursorParameterNames) { 175 this.cursorParameterNames = cursorParameterNames; 176 } 177 178 public void accept(TParseTreeVisitor v) { 179 v.preVisit(this); 180 v.postVisit(this); 181 } 182 183 public void acceptChildren(TParseTreeVisitor v) { 184 v.preVisit(this); 185 if (lowerBound != null) lowerBound.acceptChildren(v); 186 if (upperBound != null) upperBound.acceptChildren(v); 187 if (stepExpression != null) stepExpression.acceptChildren(v); 188 if (executeExpr != null) executeExpr.acceptChildren(v); 189 if (executeUsingVars != null) executeUsingVars.acceptChildren(v); 190 if (repeatExpr != null) repeatExpr.acceptChildren(v); 191 if (whilePredicate != null) whilePredicate.acceptChildren(v); 192 if (whenPredicate != null) whenPredicate.acceptChildren(v); 193 if (subquery != null) subquery.acceptChildren(v); 194 v.postVisit(this); 195 } 196}