游标是数据库中十分重要的概念,使用游标可以灵活处理数据操作,逐条从数据表中返回数据。在集算器中,面对不同的需要时,可以使用数据库游标、文件游标以及内存排列游标等多种类型的游标读取及处理数据。在这里,我们来认识什么是集算器中的游标,并且基本了解各种类型的游标。
在数据库中使用游标,可以每次返回部分数据,而不将所有结果同时读入内存。游标类似于一个指针,在读取时会通过移动指针的位置来从结果集中每次提取1条记录。游标逐条读取的机制常用来处理大数据表,这是因为受内存限制,大批数据往往不能一次全部读入内存。
在数据库中使用游标,与直接返回全部结果比较,使用灵活,而且避免了内存溢出的风险,但是速度往往会较慢。
在集算器中使用的游标,与数据库中的游标概念有所不同:
1. 集算器中的游标只用于获取数据,并不用来修改结果集。
2. 集算器中的游标在读取数据时从前向后遍历一次,相当于JDBC中TYPE_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中的游标返回EID在100以上的女性员工,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) |
在用生成游标后,每次执行时,返回的结果均为纯序表,如A2,B2,A3和B3中的结果如下:
在使用文件游标时,同样可以添加@v选项,如A6和B6中结果如下: