Exemplo n.º 1
0
 /** FOR cursor statement */
 public Integer forCursor(HplsqlParser.For_cursor_stmtContext ctx) {
   trace(ctx, "FOR CURSOR - ENTERED");
   exec.enterScope(Scope.Type.LOOP);
   String cursor = ctx.L_ID().getText();
   String sql = evalPop(ctx.select_stmt()).toString();
   trace(ctx, sql);
   Query query = exec.executeQuery(ctx, sql, exec.conf.defaultConnection);
   if (query.error()) {
     exec.signal(query);
     return 1;
   }
   trace(ctx, "SELECT completed successfully");
   exec.setSqlSuccess();
   try {
     ResultSet rs = query.getResultSet();
     if (rs != null) {
       ResultSetMetaData rm = rs.getMetaData();
       int cols = rm.getColumnCount();
       Var[] vars = new Var[cols];
       for (int i = 0; i < cols; i++) {
         vars[i] = new Var();
         vars[i].setName(cursor + "." + rm.getColumnName(i + 1));
         vars[i].setType(rm.getColumnType(i + 1));
         exec.addVariable(vars[i]);
         if (trace) {
           trace(ctx, "Column: " + vars[i].getName() + " " + rm.getColumnTypeName(i + 1));
         }
       }
       while (rs.next()) {
         for (int i = 0; i < cols; i++) {
           vars[i].setValue(rs, rm, i + 1);
         }
         visit(ctx.block());
         exec.incRowCount();
       }
     }
   } catch (SQLException e) {
     exec.signal(e);
     exec.closeQuery(query, exec.conf.defaultConnection);
     return 1;
   }
   exec.setSqlSuccess();
   exec.closeQuery(query, exec.conf.defaultConnection);
   exec.leaveScope();
   trace(ctx, "FOR CURSOR - LEFT");
   return 0;
 }
Exemplo n.º 2
0
 /** WHILE statement */
 public Integer while_(HplsqlParser.While_stmtContext ctx) {
   trace(ctx, "WHILE - ENTERED");
   String label = exec.labelPop();
   while (true) {
     if (evalPop(ctx.bool_expr()).isTrue()) {
       exec.enterScope(Scope.Type.LOOP);
       visit(ctx.block());
       exec.leaveScope();
       if (canContinue(label)) {
         continue;
       }
     }
     break;
   }
   trace(ctx, "WHILE - LEFT");
   return 0;
 }
Exemplo n.º 3
0
 /** FOR (integer range) statement */
 public Integer forRange(HplsqlParser.For_range_stmtContext ctx) {
   trace(ctx, "FOR RANGE - ENTERED");
   int start = evalPop(ctx.expr(0)).intValue();
   int end = evalPop(ctx.expr(1)).intValue();
   int step = evalPop(ctx.expr(2), 1L).intValue();
   exec.enterScope(Scope.Type.LOOP);
   Var index = new Var(ctx.L_ID().getText(), new Long(start));
   exec.addVariable(index);
   if (ctx.T_REVERSE() == null) {
     for (int i = start; i <= end; i += step) {
       visit(ctx.block());
       index.increment(new Long(step));
     }
   } else {
     for (int i = start; i >= end; i -= step) {
       visit(ctx.block());
       index.decrement(new Long(step));
     }
   }
   exec.leaveScope();
   trace(ctx, "FOR RANGE - LEFT");
   return 0;
 }