游标使用

阅读(830) 标签: 游标使用,

在集算器中使用游标,可以分批完成对大批量数据的读取,在大数据运算中是最常使用的。无论是外存文件游标、数据库游标或者内存排列游标,它们的使用方法基本都是相同的。下面将主要以外存文件游标为例,讲述在集算器中,游标的一些基本使用方法。

使用游标读取数据

在游标创立后,可以用cs.fecth() 函数读取数据。与读取普通数据表不同,在用游标读取数据时,并不会一次读出全部数据,而是需要指定返回记录的条数,或者读取数据的条件。如:

 

A

1

=file("Order_Books.txt")

2

=A1.cursor@t()

3

=A2.fetch(1000)

4

>A2.close()

5

=A2.fetch(1000)

A2中创建外存文件游标,A3中读取出前1000条数据如下:

使用fetch函数时,每次从游标中读取出的数据都会构成一个序表返回。A4中,调用cs.close() 函数关闭。游标关闭后,就无法再从中读取数据,如A5中的结果是null

游标使用后,如果不再需要,应该调用cs.close() 函数关闭,以确保释放所占内存。

 

除了读出文件或者数据库结果集中的数据,还可以在游标中用cs.skip() 跳过指定条数的记录,如:

 

A

1

=file("Order_Books.txt")

2

=A1.cursor@t()

3

>A2.skip(45000)

4

=A2.fetch()

5

=A2.fetch(1000)

A2中创建游标,A3中跳过45,000条记录,此时A4从游标中读取数据如下:

从交易ID中可以看到,读取数据时,是从第45001条记录开始的。可以注意到A4中的fetch函数中未指定返回记录的条数,此时将读取出游标中剩余的所有数据。当游标中数据被读取完毕后,游标会自动关闭,在这种情况下,可以不必再调用close

如果此时在A5中再试图从A2的游标中读取数据,是读取不到结果的:

实际上,游标中的数据,无论是skip或是fetch,只会从前向后执行一次遍历,读取完毕或者直接调用close关闭后,就无法再次使用。

 

使用fetch函数读取游标中的数据时,还有一种方式是cs.fetch(;x) 指定读取条件,读取时会一直执行到条件表达式x的值发生变化为止。如:

 

A

1

=file("Order_Books.txt")

2

=A1.cursor@t()

3

=A2.fetch(;Date)

4

=A2.fetch(1000)

5

>A2.close()

A2中创建游标,A3从游标中读取数据,一直到Date发生改变为止,读出的数据如下:

可以看到,A3中读取出了所有日期是2013-01-01的数据。如果A4中再继续从A2的游标中读取数据,将从2013-01-02开始:

需要注意的是,读取数据时,不能同时指定记录条数和读取条件,否则只有读取条件是有效的。另外,本例中游标A2中的数据并未全部取出,使用之后在A5中将其关闭。

类似的,使用skip函数跳过游标中的记录时,同样可以指定条件,如:

 

A

1

=file("Order_Books.txt")

2

=A1.cursor@t()

3

>A2.skip(;Date)

4

>A2.skip(;Date)

5

>A2.skip(;Date)

6

=A2.fetch(1000)

7

>A2.close()

A2中创建游标,在A3A4A5中分别跳过1天的记录。此时A6再从游标中读取数据,将从第4天开始:

同样的,当游标中的数据未全部取出时,在A7中调用close函数关闭游标。

循环游标

在用游标读取数据时,还可以用for语句来循环游标中的数据。如:

 

A

B

1

=file("Order_Books.txt")

 

2

=A1.cursor@t()

0

3

for A2,1000

=A3.select(SalesID==1).sum(Amount)

4

 

>B2=B2+B3

A2中创建游标,并在A3中循环游标,每次读出1000条记录,所有记录遍历完成后自动关闭游标。在A3的代码块中,根据每次取出的序表来计算1号销售员的总销售额,并记录在B2中,结果如下:

 

在循环游标时,有时并不会遍历所有数据,如:

 

A

B

C

1

=file("Order_Books.txt")

 

 

2

=A1.cursor@t()

[]

 

3

for A2,1000

=A3.select(SalesID==1)

>B2=B2|B3

4

 

if B2.len()>=5

>B2=B2(to(5))

5

 

 

break

6

>A2.close()

 

 

A2中创建游标,并在A3中循环游标,每次读出1000条记录。在A3的代码块中,根据每次取出的数据选出1号销售员的销售记录,并记录在B2中。当找到前5条记录后,停止循环。此时,B2中结果如下:

必须要注意的是,当完成计算,用break退出循环时,游标中的数据并未全部读取出来,这和前一个例子中的情况不同,游标并不会自动关闭。因此,A6中调用了close函数,关闭游标以清除其占用内存。

 

fetchskip类似,循环游标时,也可以设定条件,每次读取数据时都执行到条件表达式发生变化为止,如:

 

A

B

C

1

=file("Order_Books.txt")

 

 

2

=A1.cursor@t()

=create(Date,Count,Amount)

 

3

for A2;Date

=A3.count()

=round(A3.sum(Amount))

4

 

>B2.insert(0,A3.Date,B3,C3)

 

此时在A3中每次读出1天的销售数据,在其代码块中计算出每天的交易笔数及总金额,记录在B2的序表中。计算完成后,B2中的结果如下:

用游标执行计算

除了从游标中读取数据,在集算器中还可以直接使用一些函数,用游标完成常用的数据计算。如从游标中根据条件选出数据:

 

A

B

1

=file("Order_Books.txt")

=A1.cursor@t()

2

=B1.select(SalesID==1)

=A2.fetch()

3

=A2.fetch()

=B1.fetch()

 

B1生成外存文件游标,A2根据B1的游标中选出1号销售员的销售数据。查看A2中的数据如下:

 

可以发现,A2中的结果,和B1中是相同的。和序表或排列中的select函数不同,在游标中使用select函数时,返回的结果是游标本身,计算A2时其实并未真正从游标中获取数据,而是在游标上附加运算。在B2中执行fetch时,才会根据条件在B1游标中检索数据,结果如下:

 

B2中使用