/** 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; }
/** 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; }
/** 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; }