9.5.4使用自定义游标

如果需要用自定义函数返回游标,那么需要返回的类要实现接口com.raqsoft.dm.IlineInput。如下面的test.RandDataCursor

package test;

public class RandDataCursor implements com.raqsoft.dm.ILineInput {

  private int rowno = 0;

  private int range = 1000;

public RandDataCursor(Integer rg) {

  this.range = rg;

}

 

public Object[] readLine() throws java.io.IOException {

  rowno++;

  Object[] result = new Object[2];

  result[0] = Integer.valueOf(rowno);

  result[1] = Integer.valueOf((int) (Math.random() * range ));

  return result;

}

public boolean skipLine() throws java.io.IOException {

  rowno++;

  if (rowno <= 10000) return true;

  return false;

}

 

public void close() throws IOException {

  rowno = 10001;

}

}

IlineInput类中需要实现readLine,skipLineclose3个方法。上面的RandDataCursor比较简单,用来生成由随机整数构成的序列,其中随机数的范围可以用参数指定。readLine返回的每条记录,都由顺次增加的行号和随机数构成,类似于报表的两个字段。在skipLine方法中,可以跳过1条记录,并返回游标中是否仍有剩余数据,上面例子中设定这个游标最多返回10000条数据。close方法则用来关闭游标,释放不需要的资源,如数据库连接等。

这样,返回游标的自定义函数即可将RandDataCursor作为返回类,如:

package test;

public class Calc02 {

public static test.RandDataCursor getCursor(Integer range) {

  RandDataCursor rdc = new RandDataCursor(range);

  return rdc;

}

}

这个自定义函数只需定义一个参数,即随机数的范围,返回的结果就是RandDataCursor,用来生成随机记录的游标。在调用时,返回的IlineInput类并不能直接作为游标使用,还需要调用com.raqsoft.dm.UserUtils类中的newCursor方法,如:

 

A

1

=invoke(test.Calc02.getCursor,1000000)

2

=invoke(com.raqsoft.dm.UserUtils.newCursor,A1,"")

3

>A2.skip(100)

4

=A2.fetch@x(100)

A1中,返回自定义游标类,RandDataCursorA2中,调用UserUtils中的newCursor方法,将A1中的结果作为参数传入,A2中的数据即为集算器中的游标数据了。A3中跳过前100条记录后,A4中取出100条数据后关闭游标,A4中结果如下:

返回数据时,也可以类似与读取文本数据一样,添加@t选项,将读到的第1行数据作为标题,或者添加@1选项,将数据读为1列。如将A2中的代码改为=invoke(com.raqsoft.dm.UserUtils.newCursor,A1,"t"),即相当于添加了@t选项,A4中结果如下:

当然,这里的RandDataCursor中实际上并未设计类名,执行的结果只是将第1条数据作为列名返回。从结果中可以看到,数据中的第2列和之前的结果不同,是随机整数。