cursor()

阅读(1074) 标签: cursor,

本章介绍cursor()函数的多种用法。

cursor()

描述:

调用网格文件,将执行程序后return的结果集生成游标返回

语法:

cursor(dfx,…)

备注:

调用网格文件,将执行程序后return的结果集生成游标返回。dfx中有多个return时,先合并多个return的结果集,再将合并后的结果集返回成游标,dfx中所有的return的结果集必须具有相同的数据结构,否则报错。

查找dfx时可以使用绝对路径,也可以使用相对路径,相对路径时的搜索顺序为类路径-寻址路径-主目录。

参数:

dfx

网格文件名称

dfx的参数

选项:

@c

dfx可以是单元格,对应由func定义的子程序

返回值:

游标

示例:

主目录下test.dfx网格文件内容如下,arg1为网格参数:

 

A

B

 

1

for arg1

 

 

2

 

=connect("demo").query("select * from GYMNASTICSWOMEN where ID=?",A1)

 

3

 

=B2.derive(avg(VAULT,UNEVENBARS,BALANCEBEAM,FLOOR):Average)

 

4

 

return B3

循环计算并return结果集

 

 

A

 

1

=[5,10,20,25]

 

 

2

=cursor("test.dfx",A1)

调用test.dfx,将A1中的序列作为参数arg1的值传递进去,结果返回游标。

3

=A2.fetch()

从游标中获取记录,可以看到,结果为test.dfx中各次循环计算后return的结果集的并集。

4

=call("test.dfx",A1)

对比使用call函数调用test.dfx,最终只返回第一次循环中return的结果集

 

 

A

B

 

1

func

 

 

2

 

return A1.sum()

 

3

=cursor@c(A1,[2,5,7])

 

调用以A1为主格的代码块

4

=A3.fetch()

 

14

cursor cs cursor … cursor

描述:

基于游标针对每个cursor定义管道。

语法:

cursor cs

cursor

cursor

 

备注:

基于cs针对每个cursor定义一个管道,然后遍历游标cs,在代码块中的cursor格值即为管道,计算后再将管道结果写入cursor所在格。

参数:

cs

游标

代码块

返回值:

管道结果集

示例:

 

A

B

 

1

=to(100000).new(rand(1000):f1,rand(1000):f2).cursor()

 

产生游标

2

cursor A1

=A2.groups(f1:count(1))

遍历游标A1A2为管道,在B2代码块中计算,将结果写cursor所在格A2

3

cursor

=A3.groups(f2:count(1))

同上

A.cursor()

描述:

用序列生成游标

语法:

A.cursor(k:n)

备注:

用序列A生成游标,可将该游标分成n段,取第k段。

参数:

A

序列

k

分段号

n

总段数。kn都省略时表示取全集

选项:

@m

A.  cursor@m(n),返回成多路游标,n表示路数,缺省使用设计器中设置的最大并行数作为路数。

B.  cursor@m(mcs,K:K’,...),将有序序列按有序多路游标mcs同步分段为多路游标,K:K’为分段键

 

返回值:

游标/多路游标

示例:

 

A

 

1

=demo.query("select * from SCORES")

 

2

=A1.cursor(1:3)

A1中序表生成的游标分为3段,取第1段游标返回

3

=A1.cursor@m(3)

返回多路游标

4

=demo.query("select * from STUDENTS").sort(ID)

A4生成的序表根据ID排序

5

=demo.query("select * from STUDENTS1").sort(ID).cursor@m()

A5生成的序表根据ID排序后返回成多路游标

6

=A4.cursor@m(A5,ID:ID)

同步分段为多路游标,ID为分段键

db.cursor()

描述:

根据sql创建数据库游标返回。

语法:

db. cursor(sql {,args …})

 

db.cursor(call dfx(){,args })

通过esProc-ODBC数据源db调用dfx文件,将结果返回成游标。

备注:

根据sql创建数据库游标返回,数据扫描完将自动关闭游标。

参数:

db

数据库连接

sql

需要查询的sql语句,如select * from table

args

sql中如果用到参数,就必须转入参数值,这里可以是直接写好的参数值,或者是查询定义的args。注意,各个参数之间用逗号分隔。

dfx

网格文件。网格文件可使用相对路径或绝对路径,相对路径时相对于寻址路径。

选项:

@i

结果集只有1列时返回的游标内容为序列

@d

numeric型数据转换成double型数据而非decimal型数据

@x

关闭游标时自动关闭数据库连接,只限用connect连接的

返回值:

游标

示例:

 

A

B

C

 

1

=connect("demo")

 

2

=A1.cursor("select * from SCORES")

返回取数游标

3

=create(CLASS,STUDENTID,SUBJECT,SCORE)

构造新序表

4

for

 

 

5

 

if A4==1

=A2.skip(5)

当循环序号为1时,连跳5

6

 

=A2.fetch(3)

从游标A2取数,每次取3

7

 

if B6==null

B6为空时跳出循环

8

 

 

break

 

9

 

else

 

 

10

 

 

>A3.insert(0:B6,CLASS,STUDENTID,SUBJECT,SCORE)

B6记录插入到A3

11

=A1.cursor@ix("select NAME from STUDENTS")

添加@x选项,游标关闭时自动关闭数据库连接

12

=A11.fetch()

游标内容为序列

13

=A1.cursor@i("select NAME from STUDENTS")

报错:Data Source demo is shutdown or wrong setup.,提示数据源未启动,这是由于A11中的游标关闭时,自动关闭了数据库连接。

14

=mysql.cursor@d("select * from ta")

 

15

=A14.fetch()

16

=myproc.cursor("call hsql(?)",10).fetch()

hsql.dfx位于寻址路径中,内容如下:

myprocesProc-ODBC数据源名称。参数值为10。结果如下:

17

=demo.cursor("select * from dept  deptid<? and father=?",arg1,arg2)

arg1arg2为网格参数,设置参数默认值分别为101

18

=A17.fetch()

相关概念:

cs.fetch()

cs.skip()

f.cursor()

描述:

根据文件创建游标

语法:

f.cursor()

f.cursor(Fi:type,…;k:n,s)

备注:

根据文件f创建游标并返回,数据扫描完将自动关闭游标。

参数:

f

文件对象,仅支持文本文件对象

Fi

读出的字段,缺省读出所有,#时表示用序号定位

type

字段类型,包括:boolintlongfloatdecimalstringdatetimedatetime,缺省使用第一行数据类型。

s

自选分隔符,缺省默认分隔符是tab。省略参数s时,s前边的逗号可以省略。

k

分段号

n

总段数。kn都省略时表示读全文件。

选项:

@t

f第一行记录作为字段名,不使用本选项时默认使用_1_2,…作为字段名

@b

export出的二进制文件中读,支持参数Fikn,不支持参数types,忽略选项@t@s@i@q@m。记录数少的文件在分段读取时可能会有空段。

@e

Fi在文件中不存在时将生成null,缺省将报错。

@x

关闭时自动删除文件

@s

不拆分字段,读成游标,游标内容为单字段串构成的序表,忽略参数

@i

结果集只有1列时返回的游标内容为序列

@q

如果字段串外有引号则先剥离,包括标题部分,并处理转义。

@c

s时用逗号分隔。如果同时有s则用s分隔。

@m

f.cursor@m(Fi:type,…;n,s),返回成多路游标,n表示路数,缺省使用设计器中设置的最大并行数作为路数

@o

用引号作为转义符

@k

保留数据项两端的空白符,缺省将自动做trim

@d

行内有数据不匹配类型和格式时删除该行,此时会按type检查类型

@n

列数和第一行不匹配也作为错误处理,将被抛弃

@v

检查类型匹配且出错时抛出违例,中断程序,输出出错行的内容

返回值:

游标

示例:

 

A

B

C

 

 

1

=file("D://Student.txt").cursor@tx()

返回取数游标,将第一行记录作为字段名,并且关闭游标时自动删除文件

 

2

=create(CLASS,STUDENTID,SUBJECT,SCORE)

构造新序表

 

3

for

 

 

 

4

 

if A3==1

=A1.skip(5)

当循环序号为1时,连跳5

 

5

 

=A1.fetch(3)

从游标A1取数,每次取3

 

6

 

if B5==null

B5为空时跳出循环

 

7

 

 

break

 

 

8

 

else

 

 

 

9

 

 

>A2.insert(0:B5, CLASS,STUDENTID,SUBJECT,SCORE)

B5记录插入到A2

 

10

=file("D://Department.txt").cursor@t(Dept,Manager;,"/")

=A10.fetch()

Department.txt文件内容:

Department.txt内容以斜杠分隔,按照指定字段DeptManager读出

 

11

=file("D://Department5.txt").cursor@t(;1:2)

=A11.fetch()

省略选出字段和分隔符,将游标分成2段,读取第1段的数据

 

12

=file("D://EMPLOYEE.btx").cursor@b(GENDER;1:2)

=A12.fetch()

读取通过f.export@z()导出的集文件(即分段二进制文件)EMPLOYEE.btx中的字段GENDER,使用f.export@z()导出的二进制文件EMPLOYEE.btx缺省包含字段名。

 

13

=file("D://EMPLOYEE1.btx").cursor@b(;1:2)

=A13.fetch()

读取f.export@b()导出的二进制文件EMPLOYEE1.btx,并且将文件内容分成2份,取第1

 

14

=file("D://Department.txt").cursor@ts()

=A14.fetch()

不拆分字段,游标内容为单字段串构成的序表:

 

15

=file("D://StuName.txt").cursor@i()

=A15.fetch()

StuName.txt单字段文件,游标内容为序列

 

16

=file("D://EMPLOYEE1.txt").cursor@tc()

=A16.fetch()

EMPLOYEE1.txt内容以逗号分隔,取字段GENDER,并读取第一段数据。

 

17

=file("D://Department3.txt").cursor@e(EID)

=A17.fetch()

Department3.txt文件中没有字段EID,结果返回空,若不使用@e选项,则会报错,报错信息为:EID: field is not found

 

18

=file("D://Department2.txt").cursor@tq(;,"|")

=A18.fetch()

Department2.txt中内容如下

B19结果如下

 

19

=file("D://Department.txt").cursor@tm(DEPT:string,MANAGER:int;3,"/")

 

将游标分为3段,A19返回成多路游标

 

20

=file("D://Sale1.txt").cursor(#1,#3)

=A20.fetch()

Sale1.txt内容如下:

B20的结果如下

 

21

=file("D:/Dep3.txt").cursor@qo()

=A21.fetch()

Dep3.txt文件内容:

返回结果:

 

22

=file("D:/Dep1.txt").cursor@k()

=A22.fetch()

保留数据项两端的空白符

 

 

23

=file("D:/Department1.txt").cursor@t(id:int,name;,"|")

=A23.fetch()

返回Department1.txt中的字段idname

 

24

=file("D:/Department1.txt").cursor@td(id:int,name;,"|")

=A24.fetch()

行内有数据不匹配类型时删除该行,对比B23的结果,可以看到ida的行被删除

 

25

=file("D:/Department1.txt").cursor@tv(id:int,name;,"|")

=A25.fetch()

检查类型匹配且出错时抛出违例,中断程序,输出出错行的内容,对比B23的结果,可以看到ida的行类型不匹配。

 

26

=file("D:/Dep2.txt").cursor@tdn(id:int,name,surname;,"|")

=A26.fetch()

Dep2.txt文件内容:

68行列数与第一行不匹配,故忽略

相关概念:

cs.fetch()

cs.skip()

db.cursor()

T.cursor(x:C,…;wi...;k:n)

描述:

将实表分段后返回指定段的游标

语法:

T.cursor(x:C,…;wi,...;k:n)

备注:

把实表T分成n段,然后将第k段的数据经过x计算和过滤条件wi过滤后,返回C为字段名的游标。从附表中查询的数据也可以包括主表中的字段。

选项:

@m

T.cursor@m(x:C…;w;n) 生成路数为n的多路游标。参数n省略时用系统缺省值n为整数, n<2时返回普通游标,n省略则用【工具】-【选项】中的最大并行数。

参数:

T

实表

x

表达式

C

列别名,可省略

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。

过滤条件中还支持K:Ti的写法,K表示实表中的字段,Ti表示主键为K的序表,过滤条件中的K:Ti表示过滤掉实表中不存在K=Ti.find(K)的记录。

k

正整数,第k段,k小于等于n

n

正整数,分段数

返回值:

单路游标或多路游标

示例:

 

A

 

1

for 100

 

2

=to(10000).new(#:k1,rand():c1).sort@o(k1)

生成排号类型数据

3

=to(10000).new(#:k1,rand(10000):c2,rand()*1000:c3).sort@o(k1)

生成排号类型数据

4

=A2.cursor()

返回数据游标

5

=A3.cursor()

返回数据游标

6

=file("D:\\tb4.ctx")

 

7

=A6.create(#k1,c1;k1)

创建组表基表

8

=A7.append(A4)

在基表中追加游标记录

9

=A7.attach(table4,c2,c3)

在基表上增加附表

10

=A9.append(A5)

在附表中追加游标记录

11

=A9.cursor(;c2<1000;2:3)

将附表中c2<1000的记录分为3段,

返回第2段的所有列组成的游标

12

=A11.fetch()

获取游标中的数据

13

=A7.cursor(;c1>0.99)

从组表的基表中取出部分字段

14

=A13.fetch()

 

15

=A9.cursor(k1,c1:b,c3;c3>999)

从实表table4中取出基表的字段k1c1和附表的字段c3同时筛选c3大于999的数据,并且将c1的字段名改为b

16

=A15.fetch()

 

17

=A9.cursor@m(;;3)

@m选项生成多路游标

18

=create(k1,k2).record([1,"aa",2,"bb",3,"uh",6,"kkj",7,"fdf",10,"wwwww"]).keys(k1)

返回主键为k1的序表

19

=A6.create()

打开组表

20

=A19.cursor(;c1>0.3,k1:A18;1:3).fetch()

从实表中取出字段k1c1字段,筛选条件为c1>0.3并且k1字段值包含于A18序表的k1字段值

T.cursor(x,…;wi,...)

描述:

将集群实表/集群内表中的指定列返回成集群游标

语法:

T.cursor(x,…;wi,...)

备注:

将集群实表/集群内表的数据经过x计算和过滤条件wi过滤后,返回成集群游标。在集群中使用filecursor时都未用@z选项的话可能会导致计算错误。复写表在分机间拆分。

选项:

@m

T.cursor@m(x…;wi,...;n) 生成路数为n的同分布的集群多路游标,复写内表将被两层拆分。 n为整数, n<2时返回普通游标,n省略则用【工具】-【选项】中的最大并行数。

参数:

T

集群实表/集群内表

x

表达式

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。

过滤条件中还支持K:Ti的写法,K表示实表中的字段,Ti表示主键为K的序表,过滤条件中的K:Ti表示过滤掉实表中不存在K=Ti.find(K)的记录。

n

正整数,分段数

返回值:

集群(多路)游标

示例:

 

A

 

1

=file("D:/tb4.ctx":[1],"169.254.121.62:8281")

打开集群文件

2

=A1.open()

返回集群组表

3

=A2.attach(table3)

取出集群实表table3

4

=A2.cursor()

返回集群游标

5

=A3.cursor(NAME,GENDER;EID<6)

EID<6NAME,GENDER列返回成集群游标

6

=file("tb5.ctx":[2],"192.168.31.72:8281")

 

7

=A6.open()

 

8

=A7.cursor@m(;;3)

生成路数为3的集群多路游标

9

=A7.cursor()

 

10

=A9.memory()

生成集群内表

11

=A10.cursor()

返回集群游标

T.cursor(x:C,…;wi,...;mcs)

描述:

根据多路游标同步分段实表返回多路游标

语法:

T.cursor(x:C,…;wi,...;mcs)

备注:

根据多路游标mcs同步分段实表T,返回多路游标;用T的维和mcs的键对应同步,Tmcs分布方式必须一致。在同步分段实表时需要分段字段一致。在使用多个实表时,需要避免分段的不同步,此时就可以使用多路游标同步。

参数:

T

实表

x

表达式

C

列别名

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。

过滤条件中还支持K:Ti的写法,K表示实表中的字段,Ti表示主键为K的序表,过滤条件中的K:Ti表示过滤掉实表中不存在K=Ti.find(K)的记录。

mcs

由实表生成的多路游标

返回值:

多路游标

示例:

 

A

 

1

for 100

 

2

=to(10000).new(#:k1,rand():c1).sort@o(k1)

生成数据

3

=to(10000).new(#:k1,rand(10000):c2).sort@o(k1)

 

4

=to(10000).new(#:k1,rand()*1000:c3).sort@o(k1)

 

5

=A2.cursor()

 

6

=A3.cursor()

 

7

=A4.cursor()

 

8

=file("D:\\cs1.ctx")

 

9

=A8.create(#k1,c1;k1)

创建以k1为分段键的组表基表

10

=A9.append(A5)

 

11

=A9.attach(table1,#c2)

在基表上增加附表table1

12

=A11.append(A6)

 

13

=A11.cursor@m(;;2)

将实表table1分段后返回成多路游标

14

=A9.attach(table2,c3)

在基表上增加附表table2

15

=A14.append(A7)

 

16

=A14.cursor(;;A13)

根据table1的分段游标同步分段实表table2

T.cursor(x:C,…;wi,...;mcs)

描述:

根据集群多路游标同步分段集群实表返回集群多路游标

语法:

T.cursor(x:C,…;wi,...;mcs)

备注:

根据集群多路游标mcs同步分段集群实表T,返回集群多路游标;用T的维和mcs的键对应同步,Tmcs分布方式必须一致。在同步分段集群实表时需要分段字段一致。在使用多个集群实表时,需要避免分段的不同步,此时就可以使用集群多路游标同步。

参数:

T

集群实表

x

表达式

C

列别名

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。

过滤条件中还支持K:Ti的写法,K表示实表中的字段,Ti表示主键为K的序表,过滤条件中的K:Ti表示过滤掉实表中不存在K=Ti.find(K)的记录。

mcs

由集群实表生成的集群多路游标

返回值:

集群多路游标

示例:

 

A

 

1

=file("cs1.ctx":[1],"169.254.121.62:8281")

 

2

=A1.open()

打开集群组表

3

=A2.attach(table1)

取出集群实表table1

4

=A3.cursor@m(;;2)

返回集群多路游标

5

=A2.attach(table2)

取出集群实表table2

6

=A5.cursor(;;A4)

集群实表table2根据集群实表table1多路游标同步分段

 

T.cursor(C,…;w,...;k:n)

描述:

将内表分段后返回指定段的游标

语法:

T.cursor(C,…;wi,...;k:n)

备注:

将内表T经过wi条件过滤后分成n段,然后将第k段的数据返回成游标。C是内表的列,参数C省略时返回内表的所有列;参数k:n省略时返回全集。T为集群内表时参数k:n没有实际意义,缺省不写。

参数:

T

内表/集群内表

C

列名

wi

过滤条件,多个条件之间用逗号隔开,为AND关系。

过滤条件中还支持K:Ti的写法,K表示实表中的字段,Ti表示主键为K的序表,过滤条件中的K:Ti表示过滤掉实表中不存在K=Ti.find(K)的记录。

k

正整数,第k段,k小于等于n

n

正整数,总段数

选项:

@m

T.cursor@m(...;n) 返回路数为n的多路游标n为整数, n<2时返回普通游标,n省略则用【工具】-【选项】中的最大并行数。

返回值:

单路游标或多路游标

示例:

 

A

 

1

=demo.cursor("select EID,NAME,GENDER from employee where EID< 10")

返回取数游标

2

=A1.memory()

返回内表

3

=A2.cursor(2:3).fetch()

内表生成的游标分为3段,取第2

4

=A2.cursor@m(3).fetch()

使用@m选项,返回多路游标,内表生成的游标分为3

5

=file("test.ctx":[1],"169.254.121.62:8281")

打开集群文件

6

=A5.open()

打开集群表

7

=A6.attach(table3)

取出集群表table3

8

=A7.memory()

返回集群内表对象

9

=A8.cursor().fetch()

内表生成的游标没有分段参数

10

=A2.cursor(EID,NAME;EID<80;2:3)

将内表中EID小于80的记录分成3段,返回第2段,返回的列有EIDNAME

11

=A2.cursor@m(EID,NAME;EID<80;5)

返回多路游标

T.cursor( … ;w;mcs)

描述:

根据多路内表游标同步内表,返回多路内表游标

语法:

T.cursor(...;w;mcs)

备注:

将内表T经过w条件过滤后,返回与内表/多路游标mcs同步的多路内表游标。省略号表示选出字段,一般省略这个参数,但分号不能省略。

参数:

T

内表

w

过滤条件

mcs

内表或组表生成的多路游标

返回值:

多路内表游标

示例:

 

A

 

1

=demo.cursor("select * from employee where EID < 10")

返回取数游标

2

=A1.memory().keys(EID)

返回内表,并设置主键为EID

3

=file("d://emp.ctx").create().cursor@m()

打开组表,并返回多路游标

4

=A2.cursor(;SALARY>8000;A3)

返回与A3同步的多路内表游标

mcs.cursor(n)

描述:

多路游标归并转成n路游标

语法:

mcs.cursor(n)

备注:

多路游标归并转成n路游标,n比原来的路数小,缺省转成单路游标。

参数:

mcx

内表/集群内表

n

列名

返回值:

单路游标或多路游标

示例:

 

A

 

1

=file("D:\\dept2.txt").cursor@m()

取出dept2.txt中的数据,返回多路游标

2

=A2.fetch()

A1中获取记录

3

=A2.cursor().groups(#3:FATHER;count(#1):TOTAL)

转成单路游标后分组聚合