Beispiel #1
0
 /** DECLARE cursor statement */
 public Integer declareCursor(HplsqlParser.Declare_cursor_itemContext ctx) {
   String name = ctx.ident().getText();
   if (trace) {
     trace(ctx, "DECLARE CURSOR " + name);
   }
   Query query = new Query();
   if (ctx.expr() != null) {
     query.setExprCtx(ctx.expr());
   } else if (ctx.select_stmt() != null) {
     query.setSelectCtx(ctx.select_stmt());
   }
   exec.addVariable(new Var(name, Type.CURSOR, query));
   return 0;
 }
Beispiel #2
0
 /** OPEN cursor statement */
 public Integer open(HplsqlParser.Open_stmtContext ctx) {
   trace(ctx, "OPEN");
   Query query = null;
   Var var = null;
   String cursor = ctx.L_ID().toString();
   String sql = null;
   // Dynamic SQL
   if (ctx.T_FOR() != null) {
     sql = evalPop(ctx.expr()).toString();
     if (trace) {
       trace(ctx, cursor + ": " + sql);
     }
     query = new Query(sql);
     var = new Var(cursor, Type.CURSOR, query);
     exec.addVariable(var);
   }
   // Declared cursor
   else {
     var = exec.findVariable(cursor);
     if (var != null && var.type == Type.CURSOR) {
       query = (Query) var.value;
       if (query.sqlExpr != null) {
         sql = evalPop(query.sqlExpr).toString();
         query.setSql(sql);
       } else if (query.sqlSelect != null) {
         sql = evalPop(query.sqlSelect).toString();
         query.setSql(sql);
       }
       if (trace) {
         trace(ctx, cursor + ": " + sql);
       }
     }
   }
   // Open cursor now
   if (query != null) {
     exec.executeQuery(ctx, query, exec.conf.defaultConnection);
     if (query.error()) {
       exec.signal(query);
       return 1;
     } else if (!exec.getOffline()) {
       exec.setSqlCode(0);
     }
   } else {
     trace(ctx, "Cursor not found: " + cursor);
     exec.setSqlCode(-1);
     exec.signal(Signal.Type.SQLEXCEPTION);
     return 1;
   }
   return 0;
 }
Beispiel #3
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;
 }
Beispiel #4
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;
 }