游标概念

阅读(4520) 标签: 游标,

游标是数据库中十分重要的概念,使用游标可以灵活处理数据操作,逐条从数据表中返回数据。在集算器中,面对不同的需要时,可以使用数据库游标、文件游标以及内存排列游标等多种类型的游标读取及处理数据。在这里,我们来认识什么是集算器中的游标,并且基本了解各种类型的游标。

游标的概念

在数据库中使用游标,可以每次返回部分数据,而不将所有结果同时读入内存。游标类似于一个指针,在读取时会通过移动指针的位置来从结果集中每次提取1条记录。游标逐条读取的机制常用来处理大数据表,这是因为受内存限制,大批数据往往不能一次全部读入内存。

在数据库中使用游标,与直接返回全部结果比较,使用灵活,而且避免了内存溢出的风险,但是速度往往会较慢。

在集算器中使用的游标,与数据库中的游标概念有所不同:

1. 集算器中的游标只用于获取数据,并不用来修改结果集。

2. 集算器中的游标在读取数据时从前向后遍历一次,相当于JDBCTYPE_FORWARD_ONLY的设定。

3. 集算器游标不仅可以来自数据库,还可以源自数据文件或者内存排列。

集算器中,不同种类游标的使用方法是基本相同的,而且可以混合使用。

数据库游标

db.cursor(sql) 函数,可以将数据库中返回的数据转为游标,如:

 

A

1

=demo.cursor("select * from EMPLOYEE")

2

=A1.fetch(100)

3

=A1.fetch(100)

4

>A1.close()

A1中创建数据库游标,A2在游标中获取前100条记录如下:

fetch获取游标中的数据时,会构成序表返回。

当在A3中再次读取100条记录时,由于用游标读取数据时只会从前向后单次遍历,因此会继续从结果集中获取数据:

从员工序号中可以发现,A3中读取的数据是从第101位员工开始的。在本例中只是简单用fetch读取游标中的数据,集算器中游标更多的使用方法,可以阅读游标使

当取数完成后,如果游标中的数据并未全部读出,需要用cs.close() 关闭游标。将游标及时关闭,这对数据库游标尤其重要。由于数据库游标是从数据库来获取数据的,如果游标不关闭,与数据库的连接会一直存在,不但会占用不必要的资源,还有可能造成数据库中游标超过限制的错误。

 

与用db.query() 函数查询数据时类似,在建立数据库游标时,也可以使用参数,如:

 

A

1

=demo.cursor("select EID, NAME, SURNAME, GENDER, STATE from EMPLOYEE where GENDER=? and EID>?","F",100)

2

=A1.fetch()

SQL语句中,需要使用的参数用 ? 代替,并在后面依次输入,用逗号分隔。A1中的游标返回EID100以上的女性员工,A2中返回游标中的所有数据如下:

A2中使用fetch时,未指定数据条数,此时将返回游标中的所有数据,当游标中的所有数据读取完成后,游标将自动关闭,此时可以不再调用cs.close()

外存文件游标

在实际应用,尤其是大数据处理中,很多数据并非来自数据库,而是来源于文件。因此,集算器中提供了外存文件游标,可以从格式化的文件中构成游标读取数据。如文本文件PersonnelInfo.txt中存储了很多员工的资料:

在文件中,每条记录占一行,各列之间用制表符Tab分隔。用外存文件游标即可根据文件构成游标,并读取其中的数据。如:

 

A

1

=file("PersonnelInfo.txt")

2

=A1.cursor@t()

3

>A2.skip(50000)

4

=A2.fetch(100)

5

>A2.close()

A2中根据外存文件构成游标,并添加了@t选项,这样可以将文件中的第一行作为结果集的列名。A3中跳过前50,000条数据,然后在A4中读取100条数据如下:

外存文件游标在使用时与数据库游标是相同的,获取数据时同样是单向单次遍历。A3中用cs.skip() 跳过数据后,A4中读取的数据将从第50,001条开始。

在用文件创建游标时,也可以不使用其中的所有数据,而是选出指定字段,如:

 

A

1

=file("PersonnelInfo.txt")

2

=A1.cursor@t(ID, Name, State, Gender)

3

>A2.skip(50000)

4

=A2.fetch(100)

5

>A2.close()

网格中的代码基本与前一个例子相同,只是在A2中构建外存文件游标时,选出了指定的字段。A4中返回结果如下:

需要注意的是,只有使用@t选项读入了字段名时才能使用字段名选择。如果未使用@t选项,只能直接按位置指定字段,如=A1.cursor(#1, #2, #6, #3)

关于外存文件游标,将在中深入讲解。

用游标返回纯序表

本小节内容,涉及功能只有企业版集算器才可使用,其它版本的产品用户可以跳过。

db.query@v(sql) 类似,用游标查询数据时,也可以添加@v选项,使得cs.fetch() 返回纯序表,例如:

 

A

B

1

=demo.cursor@v("select EID, NAME, BIRTHDAY from employee")

 

2

=A1.fetch(20)

=ifpure(A2)

3

=A1.fetch@x(20)

=ifpure(A3)

4

=file("PersonnelInfo.txt")

 

5

=A4.cursor@tv(ID, Name, State, Gender)

>A5.skip(90000)

6

=A5.fetch@x(100)

=ifpure(A6)

在用生成游标后,每次执行时,返回的结果均为纯序表,如A2B2A3B3中的结果如下:

 

 

在使用文件游标时,同样可以添加@v选项,如A6B6中结果如下: