本章介绍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 |
描述:
用序列生成游标
语法:
A.cursor(k:n)
备注:
用序列A生成游标,可将该游标分成n段,取第k段,k:n缺省取全集
参数:
A |
序列 |
k |
分段号 |
n |
总段数。k和n都省略时表示取全集。 |
选项:
@m |
A.cursor@m(n),返回成多路游标,n表示路数,缺省使用设计器中设置的最大并行数作为路数。 |
返回值:
游标/多路游标
示例:
|
A |
|
1 |
=demo.query("select * from SCORES") |
|
2 |
=A1.cursor(1:3) |
将A1中序表生成的游标分为3段,取第1段游标返回 |
3 |
=A1.cursor@m(3) |
返回多路游标 |
描述:
根据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) |
从游标A1取数,每次取3条 |
|
7 |
|
if B6==null |
当B5为空时跳出循环 |
|
8 |
|
|
break |
|
9 |
|
else |
|
|
10 |
|
|
>A3.insert(0:B6,CLASS,STUDENTID,SUBJECT,SCORE) |
把B5记录插入到A2中 |
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位于寻址路径中,内容如下: myproc为esProc-ODBC数据源名称。参数值为10。结果如下: |
||
17 |
=demo.cursor(“select * from dept deptid<? and father=?”,arg1,arg2) |
arg1、arg2为网格参数,设置参数默认值分别为10、1 |
||
18 |
=A17.fetch() |
|
相关概念:
描述:
根据文件创建游标
语法:
f.cursor() |
f.cursor(Fi:type,…;k:n,s) |
备注:
根据文件f创建游标并返回,数据扫描完将自动关闭游标。
参数:
f |
文件对象,仅支持文本文件对象 |
Fi |
读出的字段,缺省读出所有,用#时表示用序号定位 |
type |
字段类型,包括:bool、int、long、float、decimal、string、date、time和datetime,缺省使用第一行数据类型。 |
s |
自选分隔符,缺省默认分隔符是tab。省略参数s时,s前边的逗号可以省略。 |
k |
分段号 |
n |
总段数。k和n都省略时表示读全文件。 |
选项:
@t |
f中第一行记录作为字段名,不使用本选项时默认使用_1,_2,…作为字段名 |
|
@b |
从export出的二进制文件中读,支持参数Fi、k和n,不支持参数type和s,忽略选项@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内容以斜杠分隔,按照指定字段Dept和Manager读出 |
|
||||
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() |
|
|
||||
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() |
返回结果: |
|
||||
22 |
=file("D:/Dep1.txt").cursor@k() |
=A22.fetch() |
保留数据项两端的空白符
|
|
||||
23 |
=file("D:/Department1.txt").cursor@t(id:int,name;,"|") |
=A23.fetch() |
返回Department1.txt中的字段id与name |
|
||||
24 |
=file("D:/Department1.txt").cursor@td(id:int,name;,"|") |
=A24.fetch() |
行内有数据不匹配类型时删除该行,对比B23的结果,可以看到id为a的行被删除 |
|
||||
25 |
=file("D:/Department1.txt").cursor@tv(id:int,name;,"|") |
=A25.fetch() |
检查类型匹配且出错时抛出违例,中断程序,输出出错行的内容,对比B23的结果,可以看到id为a的行类型不匹配。 |
|
||||
26 |
=file("D:/Dep2.txt").cursor@tdn(id:int,name,surname;,"|") |
=A26.fetch() |
Dep2.txt文件内容: 第6、8行列数与第一行不匹配,故忽略 |
|||||
相关概念:
描述:
将实表分段后返回指定段的游标
语法:
T.cursor(x:C,…;w;k:n)
备注:
把实表T分成n段,然后将第k段的数据经过x计算和过滤条件w过滤后,返回以C为字段名的游标。从附表中查询的数据也可以包括主表中的字段。
选项:
@m |
T.cursor@m(x:C…;w;n) 生成路数为n的多路游标。参数n省略时用系统缺省值n为整数, n<2时返回普通游标,n省略则用【工具】-【选项】中的最大并行数。 |
参数:
T |
附表 |
x |
表达式 |
C |
列别名,可省略 |
w |
过滤条件,缺省读取全集 |
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中取出基表的字段k1、c1和附表的字段c3同时筛选c3大于999的数据,并且将c1的字段名改为b。 |
16 |
=A15.fetch() |
|
17 |
=A9.cursor@m(;;3) |
用@m选项生成多路游标 |
描述:
将集群实表/集群内表中的指定列返回成集群游标
语法:
T.cursor(x,…;w)
备注:
将集群实表/集群内表中的数据经过x计算和过滤条件w过滤后,返回成集群游标。在集群中使用file和cursor时都未用@z选项的话可能会导致计算错误。
选项:
@m |
T.cursor@m(x…;w;n) 生成路数为n的同分布的集群多路游标。n为整数, n<2时返回普通游标,n省略则用【工具】-【选项】中的最大并行数。 |
@z |
(此选项只针对集群非分布表)集群复写表/集群内表在分机间拆分处理。 |
参数:
T |
集群实表/集群内表 |
x |
表达式 |
w |
过滤条件,缺省读取全集 |
n |
正整数,分段数 |
返回值:
集群(多路)游标
示例:
|
A |
|
1 |
=file@n("D:/tb4.ctx","169.254.121.62:8281") |
打开复写文件 |
2 |
=A1.create() |
创建复写类型集群组表 |
3 |
=A2.attach(table3) |
取出集群实表table3 |
4 |
=A2.cursor() |
返回集群游标 |
5 |
=A3.cursor(NAME,GENDER;EID<6) |
将EID<6的NAME,GENDER列返回成集群游标 |
6 |
=file@0("tb4.ctx",["169.254.121.62:8281","192.168.31.72:8291"]) |
打开复写文件 |
7 |
=A6.create() |
|
8 |
=A7.cursor@z() |
用@z选项返回复写表,在分机间拆分 |
9 |
=file@z("tb5.ctx","192.168.31.72:8281") |
|
10 |
=A9.create(;;"@!*123") |
|
11 |
=A10.cursor@m(;;3) |
生成路数为3的集群多路游标 |
12 |
=A10.cursor() |
|
13 |
=A12.memory() |
生成集群内表 |
14 |
=A13.cursor() |
返回集群游标 |
描述:
根据多路游标同步分段实表,返回多路游标
语法:
T.cursor(x:C,…;w;mcs)
备注:
根据多路游标mcs同步分段实表T,返回多路游标;用T的维和mcs的键对应同步,T和mcs的分布方式必须一致。在同步分段实表时需要分段字段一致。在使用多个实表时,需要避免分段的不同步,此时就可以使用多路游标进行同步。
参数:
T |
实表 |
x |
表达式 |
C |
列别名 |
w |
过滤条件,缺省读取全集 |
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,…;w;mcs)
备注:
根据集群多路游标mcs同步分段集群实表T,返回集群多路游标;用T的维和mcs的键对应同步,T和mcs分布方式必须一致。在同步分段集群实表时需要分段字段一致。在使用多个集群实表时,需要避免分段的不同步,此时就可以使用集群多路游标进行同步。
参数:
T |
集群实表 |
x |
表达式 |
C |
列别名 |
w |
过滤条件,缺省读取全集 |
mcs |
由集群实表生成的集群多路游标 |
返回值:
集群多路游标
示例:
|
A |
|
1 |
=file@z("D:/cs1.ctx","169.254.121.62:8281") |
|
2 |
=A1.create() |
打开分布类型集群组表 |
3 |
=A2.attach(table1) |
取出集群实表table1 |
4 |
=A3.cursor@m(;;2) |
返回集群多路游标 |
5 |
=A2.attach(table2) |
取出集群实表table2 |
6 |
=A5.cursor(;;A4) |
集群实表table2根据集群实表table1多路游标同步分段 |
描述:
将内表分段后返回指定段的游标
语法:
T.cursor(k:n)
备注:
把内表T分成n段,然后将第k段的数据返回成游标。参数省略时返回全集。T为集群内表时参数k:n没有实际意义,缺省不写。
注意:在集群中file和cursor都没有@z选项很可能导致计算错误。
参数:
T |
内表/集群内表 |
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@n("D:/test.ctx","169.254.121.62:8281") |
打开复写文件 |
6 |
=A5.create() |
创建复写类型集群表 |
7 |
=A6.attach(table3) |
取出集群表table3 |
8 |
=A7.memory() |
返回集群内表对象 |
9 |
=A8.cursor().fetch() |
内表生成的游标没有分段参数 |