本章介绍cursor()函数的多种用法。
描述:
调用网格文件,将执行程序后return的结果集生成游标返回。
cursor(spl,…)
备注:
调用网格文件,将执行程序后return的结果集生成游标返回。spl中有多个return时,先合并多个return的结果集,再将合并后的结果集返回成游标,spl中所有的return的结果集必须具有相同的数据结构,否则报错。
查找spl时可以使用绝对路径,也可以使用相对路径,相对路径时的搜索顺序为类路径-寻址路径-主目录。
该函数返回的游标不可回转。
参数:
spl |
网格文件名称。 |
… |
spl的参数。 |
选项:
@c |
spl可以是单元格,对应由func定义的子程序。 |
返回值:
游标
示例:
主目录下test.splx网格文件内容如下,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.splx",A1) |
调用test.splx,将A1中的序列作为参数arg1的值传递进去,结果返回游标。 |
3 |
=A2.fetch() |
从游标中获取记录,可以看到,结果为test.splx中各次循环计算后return的结果集的并集。 |
4 |
=call("test.splx",A1) |
对比使用call函数调用test.splx,最终只返回第一次循环中return的结果集。 |
|
A |
B |
|
1 |
func |
|
|
2 |
|
return A1.sum() |
|
3 |
=cursor@c(A1,[2,5,7]) |
|
调用以A1为主格的代码块。 |
4 |
=A3.fetch() |
|
14 |
描述:
基于游标针对每个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)) |
遍历游标A1,A2为管道,在B2代码块中计算,将结果写cursor所在格A2中。 |
3 |
cursor |
=A3.groups(f2:count(1)) |
同上。 |
描述:
用序列生成游标。
语法:
备注:
用序列A生成游标,可将该游标分成n段,取第k段。
参数:
A |
序列 |
k |
分段号 |
n |
总段数。k和n都省略时表示取全集。 |
选项:
@p |
假定对第一字段有序,分段时不会将第一字段相同记录分到两段。 |
返回值:
游标
示例:
|
A |
|
1 |
=demo.query("select * from SCORES") |
返回序列。 |
2 |
=A1.cursor(1:3) |
用A1中序列生成游标,并将游标分为3段,取第1段返回。 |
3 |
=A1.cursor() |
用A1中序列生成游标,参数缺省返回全集。 |
4 |
=demo.query("select CLASS,STUDENTID,SUBJECT,SCORE from SCORES").sort(CLASS) |
返回对第一个字段有序的序列。 |
5 |
=A4.cursor@p(1:3) |
使用@p选项,分段时,将Class相同的分到一起,并不是严格的按照参数k和n分配。 |
描述:
用序列生成多路游标。
A.cursor@m(n)
备注:
用序列A生成多路游标。
参数:
A |
序列。 |
n |
表示路数,缺省使用设计器中设置的多路游标缺省路数值作为路数;第三方应用程序中集成使用时,缺省路数为raqsoftConfig.xml文件中配置的cursorParallelNum的值。 |
选项:
@p |
假定对第一个字段有序,分段时不会将第一字段相同记录分到两段中。 |
返回值:
多路游标
示例:
|
A |
|
1 |
=demo.query("select CLASS,STUDENTID,SUBJECT,SCORE from SCORES") |
返回序列。 |
2 |
=A1.cursor@m() |
用序列生成多路游标,参数缺省使用多路游标缺省路数的值作为路数。 |
3 |
=demo.query("select CLASS,STUDENTID,SUBJECT,SCORE from SCORES").sort(CLASS) |
返回对第一个字段有序的序列。 |
4 |
=A1.cursor@mp(3) |
生成多路游标,路数为3,使用@p选项,分段时不会将CLASS相同的记录分到两段中。 |
描述:
用序列生成与多路游标mcs同步分段的多路游标。
语法:
A.cursor@m(mcs,K:K‘,...)
备注:
将有序序列A按多路游标mcs同步分段,返回多路游标,K、K’分别为A和mcs的分段键。
参数:
A |
有序序列。 |
mcs |
多路游标。 |
K |
A的分段键。 |
K’ |
mcs的分段键。 |
选项:
@p |
只按msc和A的第一个字段对比分段,忽略参数K:K’。 |
返回值:
多路游标
示例:
|
A |
|
1 |
=to(10000).new(#:c1,rand():c2).sort(c1) |
生成序列。 |
2 |
=A1.cursor@m(3) |
用序表生成多路游标,路数为3。 |
3 |
=to(10000).new(#:k1,rand(10000):k2,rand()*1000:k3).sort(k1) |
生成对k1有序的序表。 |
4 |
=A3.cursor@m(A2,k1:c1) |
用A3序表生成与A2同步分段的多路游标,分段键分别为k1、c1。 |
5 |
=A3.cursor@mp(A2) |
用A3序表生成与A2同步分段的多路游标,使用@p选项,使用A3和A2的第一个字段对比分段,此时表达式中无需分段键参数。 |
描述:
用游标序列生成多路游标。
CS.cursor()
备注:
用游标序列CS生成多路游标。游标序列中游标的结构必须相同。成员是多路游标时则拼成更多路游标。
参数:
CS |
游标组成的序列。 |
返回值:
多路游标
示例:
test_mcs.splx为远程节点机服务器的部署文件,节点机分别为【"192.168.0.204"," 192.168.0.205","192.168.0.206"】,端口号为8081,文件内容如下:
|
A |
1 |
=connect("demo").cursor("select * from SCORES where SUBJECT=?",arg1) |
2 |
return A1 |
|
A |
|
1 |
=callx("test_mcs.splx",["English","Math","PE"];["192.168.0.204:8081" ,"192.168.0.205:8081","192.168.0.206:8081"]) |
从三台并行机返回3个游标组成序列。 |
2 |
=A1.cursor() |
用游标序列生成多路游标。 |
3 |
=A2.fetch() |
从多路游标中取出所有记录。 |
描述:
语法:
cs.cursor@m(n)
备注:
基于单路游标cs生成多路游标,从cs中取出数据后并行分配成n路。
参数:
cs |
单路游标。 |
n |
表示路数,缺省使用设计器中设置的多路游标缺省路数值作为路数;第三方应用程序中集成使用时,缺省路数为raqsoftConfig.xml文件中配置的cursorParallelNum的值。 n为0时生成缓存游标,会有取数线程在缓存数据,通常用于往组表中追加游标数据。 |
返回值:
单路游标/多路游标/缓存游标
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE") |
|
2 |
=A1.cursor@m(3) |
生成多路游标。 |
|
A |
|
1 |
=demo.cursor("select EID,NAME,GENDER,DEPT, SALARY from employee") |
|
2 |
=A1.cursor@m(0) |
生成缓存游标。 |
3 |
=file("emp.ctx").open() |
打开组表文件。 |
4 |
=A3.append(A2) |
将游标A2中的数据追加到emp.ctx中,游标输出数据的时取数线程会缓存数据。 |
描述:
语法:
db. cursor(sql {,args …})
备注:
根据sql创建数据库游标,数据扫描完将自动关闭游标。
参数:
db |
数据源连接。 |
sql |
sql查询语句。 |
args |
传递给sql的参数;可以是参数值,也可以是定义过的参数名称,多个参数之间用逗号分隔。 |
选项:
@i |
结果集只有1列时返回的游标内容为序列。 |
@d |
将numeric型数据转换成double型数据而非decimal型数据。 |
@x |
关闭游标时自动关闭数据库连接,只限用connect方式的db连接,使用该选项返回的游标不能回转。 |
@v |
生成纯序表/纯序列游标。 |
返回值:
游标
示例:
|
A |
|
1 |
=demo.cursor("select * from SCORES") |
db参数为数据源名称,此时要求demo是连接成功的状态。 |
2 |
=connect("demo") |
|
3 |
=A2.cursor@x("select * from SCORES").fetch() |
connect连接方式,可以使用@x选项。 |
4 |
=A2.cursor("select * from STUDENTS") |
正常会出现报错:Data Source demo is shutdown or wrong setup.,提示数据源未启动,这是由于A3中的游标关闭时,自动关闭了数据库连接。 |
sql中有参数:
|
A |
|
1 |
>arg2="R&D" |
定义参数名为arg2,参数值为"R&D"。 |
2 |
=demo.cursor("select EID,NAME,DEPT,GENDER from employee where EID<? and DEPT=? and GENDER=?",arg1,arg2,"M") |
查询employee表中的内容,其中arg1为网格参数,参数值为100,arg2为A1格中定义的参数,第三个参数直接传递参数值为“M”。 |
3 |
=A2.fetch() |
读取A2游标中的数据: |
返回其他类型游标数据:
|
A |
|
1 |
=demo.cursor("select NAME from STUDENTS") |
从demo数据源中查询STUDENTS表的NAME字段,返回游标内容如下: |
2 |
=demo.cursor@i("select NAME from STUDENTS") |
结果集只有一列时,使用@i选项,返回的游标内容为序列: |
3 |
=demo.cursor@v("select * from STUDENTS") |
返回纯序表游标。 |
4 |
=demo.cursor@iv("select NAME from STUDENTS") |
返回纯序列游标。 |
5 |
=mysql.cursor@d("select * from ta") |
使用@d选项,numeric型数据将被转换成double: |
相关概念:
描述:
根据文件创建游标。
语法:
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@a@n@k@p@f@l@m@c@o@d@v@r。记录数少的文件在分段读取时可能会有空段。 |
@e |
Fi在文件中不存在时将生成null,缺省将报错。 |
@x |
关闭时自动删除文件,使用该选项返回的游标不能回转。 |
@s |
不拆分字段,读成游标,游标内容为单字段串构成的序表,忽略参数。 |
@i |
结果集只有1列时返回的游标内容为序列。 |
@q |
剥离数据项两端引号,包括标题,处理转义;中间的引号不作处理。 |
@c |
s缺省时用逗号分隔。 |
@m |
f.cursor@m(Fi:type,…;n,s),返回成多路游标,此处n表示路数,缺省使用设计器中设置的多路游标缺省路数值作为路数,第三方应用程序中集成使用时,缺省路数为raqsoftConfig.xml文件中配置的cursorParallelNum的值。 |
@o |
用引号作为转义符。 |
@k |
保留数据项两端的空白符,缺省将自动删除两端空白符。 |
@d |
行内有数据不匹配类型和格式时删除该行,此时会按type检查类型;@p@q时括号和引号不匹配时也删除该行。 |
@n |
列数和第一行不匹配也作为错误处理,不匹配的记录行将被抛弃。 |
@v |
@d@n检查出错时抛出违例,中断程序,输出出错行的内容。 |
@w |
把每行读成序列,结果为序列的序列构成的游标,列名也算作一行。 |
@a |
将单引号作为引号处理,缺省不处理,可与@q@p组合使用。 |
@p |
解析时处理括号和引号匹配,括号内分隔符不算,同时引号外转义也处理。 |
@f |
不做任何解析,简单用分隔符拆成串。 |
@l |
允许续行,行尾是转义字符\ 。 |
游标/多路游标
示例:
|
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@cqo() |
|
=A21.fetch() |
使用@o选项,串中两个引号表示一个引号,返回结果: |
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行列数与第一行不匹配,故忽略: |
27 |
=file("D:/Desktop/DemoData/txt/City.txt").cursor@w() |
|
=A27.fetch() |
使用@w选项,将每行读成序列的序列: |
28 |
=file("D://t1.txt").cursor@c() |
|
=A28.fetch() |
t1.txt文件内容: 使用@c选项,分隔符缺省使用逗号,返回结果: |
29 |
=file("D://t1.txt").cursor@cp() |
|
=A29.fetch() |
使用@p选项,解析时处理括号和引号匹配: |
30 |
=file("D://t1.txt").cursor@cpa() |
|
=A30.fetch() |
使用@a选项,将单引号作为引号处理: |
31 |
=file("D://t2.txt").cursor@l() |
|
=A31.fetch() |
t2.txt内容如下: 使用@l选项,行尾为转义符\时允许续行: |
32 |
=file("D://t3.txt").cursor@f() |
|
=A32.fetch() |
使用@f选项,直接用分隔符拆成串: |
相关概念:
描述:
将实表/内表/复组表分段后返回指定段的游标。
语法:
T.cursor(x:C,…;wi,...;k:n)
备注:
把实表/内表/复组表的数据经过x计算和过滤表达式wi过滤后,分成n段,返回第k段的游标,C为结果字段名。从附表中查询的数据也可以包括主表中的字段。
T为复组表时,所有分表同步分段,结果按维度归并。
选项:
@m |
T.cursor@m(x:C…;w;n) 生成路数为n的多路游标。参数n省略时用系统缺省值n为整数, n<2时返回普通游标,n省略则用工具 - 选项中的多路游标缺省路数值。 |
@v |
生成纯序表列式游标,相较普通游标性能有所提升。 |
@x |
游标取完则自动关闭T。 |
@g |
T为复组表时,如果后续对游标执行group计算,使用@g选项可提升计算速度。 |
@w |
用于带有更新标识的复组表。 按更新机制归并,分表间存在相同键值时,忽略分表号较小的分表中的记录。分段要以第1分表为准。 处理更新标记,有删除标识的记录不返回到游标中,删除标识记录的键值在复组表中是唯一时,该条记录也会被保留。 使用该选项时,强制读出键字段,如果表中有删除标识列,则也会被强制读出。 |
@z |
逆序取,此时不支持分段。 |
@p |
T为复组表,按照第一个字段归并。 |
参数:
返回值:
单路游标/多路游标
示例:
|
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) |
为组表A6创建k1为键的基表。 |
8 |
=A7.append(A4) |
将A4游标中的数据追加到基表中。 |
9 |
=A7.attach(table4,c2,c3) |
在基表上创建,名为table4的附表。 |
10 |
=A9.append(A5) |
将A5游标中的数据追加到附表table4中。 |
11 |
=A9.cursor(;c2<1000;2:3) |
将附表中c2<1000的记录分为3段,返回第2段的所有列组成的游标。 |
12 |
=A11.fetch() |
获取游标中的数据: |
13 |
=A7.cursor(;c1>0.99) |
从基表中取出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选项将附表table4生成多路游标。 |
|
A |
|
1 |
=file("employee1.ctx") |
生成组表文件employee1.ctx。 |
2 |
=A1.create@y(#EID,NAME,GENDER,SALARY) |
创建组表employee1.ctx的基表,EID、NAME、GENDER、SALARY为基表的列名,其中EID表示维。 |
3 |
=connect("demo").cursor("select EID,NAME,GENDER,SALARY from employee") |
返回游标。 |
4 |
=A2.append@i(A3) |
将A3游标中的记录追加到基表A2中。 |
5 |
=A2.cursor@vx(;SALARY>1000;) |
返回列式游标,游标取完自动关闭A2组表。 |
6 |
=A5.groups(GENDER;avg(SALARY):SALARY_AVG) |
对游标中的数据进行分组聚合运算: |
7 |
=A2.cursor(;SALARY>2000) |
报错,提示“Stream Closed” |
T为复组表:
|
A |
|
1 |
=100000.new(~:ID,rand(2):FM).cursor() |
|
2 |
=file("nc.ctx":[1,2]) |
生成文件组。 |
3 |
=A2.create@y(#ID,FM;if(FM==1,1,2)) |
返回复组表。 |
4 |
=A3.append@x(A1) |
将A1游标中的数据追加到复组表中,此时复组表内容如下: 1.nc.ctx 2.nc.ctx
|
5 |
=A3.cursor(;;1:3) |
将复组表分成3段返回第1段,默认按照维归并,返回游标内容如下: 可以看到分表1和分表2的数据已经按维归并。 |
多种过滤方式:
|
A |
|
1 |
=file("emp.ctx") |
|
2 |
=A1.open() |
打开组表文件。 |
3 |
=A2.import() |
省略参数,返回实表中的所有数据 : |
4 |
=5.new(~:ID,~*~:Num).keys(ID) |
生成ID为键的序表: |
5 |
=A2.cursor(EID,NAME;EID=A4.find(EID)) |
使用K=w过滤方式,w是Ti.find(K),实表中使EID=A4.find(EID)计算结果为null或false的记录过滤掉;EID为选出字段,赋值为序表A4的指引字段: |
6 |
=A2.cursor(EID,NAME;EID=A4.pfind(EID)) |
使用K=w过滤方式,w是Ti.pfind(K),实表中使EID=A4.pfind(EID)计算结果为null或false的记录过滤掉;EID为选出字段,赋值为EID在序表A4中的序号: |
7 |
=A2.cursor(EID,NAME;EID:A4) |
使用K:Ti过滤方式,用实表中EID的值与序表的键值作对比,匹配不上的将被过滤掉: |
8 |
=A2.cursor(NAME,SALARY;EID:A4) |
K不被选出的情况,EID不是选出字段,仅过滤: |
9 |
=A2.cursor(EID,NAME;EID:A4:null) |
使用K:Ti:null过滤方式,用实表中EID的值与序表的键值作对比,可以匹配上的将被过滤掉: |
10 |
=A2.cursor(EID,NAME;EID:A4:#) |
使用K:Ti:#过滤方式,根据实表中EID的值去对比序表的记录序号,对应不上的记录将被过滤掉: |
11 |
=connect("demo").query("select top 2 NAME,GENDER from employee").keys(NAME) |
返回序表,键为NAME: |
12 |
=A2.cursor(EID,NAME;(EID=A4.find(EID),NAME=A11.find(NAME),EID!=null&&NAME!=null)) |
使用(K1=w1,…Ki=wi,w)过滤方式,返回符合所有条件的记录: |
使用@z选项,逆序取:
|
A |
|
1 |
=100000.new(~:ID,rand(2):FM) |
|
2 |
=file("curz.ctx") |
|
3 |
=A2.create@y(#ID,FM) |
创建组表。 |
4 |
=A3.append@i(A1) |
|
5 |
=A4.cursor().fetch() |
将组表返回成游标,并读取游标中的数据: |
6 |
=A4.cursor@z().fetch() |
使用@z选项逆序取,读取游标中的数据如下: |
使用@w选项,识别更新标识:
|
A |
|
1 |
=connect("demo").cursor("select EID,NAME,GENDER from employee") |
|
2 |
=A1.derive(:Defiled) |
|
3 |
=A2.new(EID,Defiled,NAME,GENDER) |
返回游标,内容如下: |
4 |
=file("ecd.ctx":[1,2]) |
文件组1.ecd.ctx、2.ecd.ctx。 |
5 |
=A4.create@yd(#EID,Defiled,NAME,GENDER;if(GENDER=="F",1,2)) |
创建复组表,EID为键,使用@d选项,将Defiled作为更新标识字段,GENDER值为F的记录分到1.ed.ctx中,其余分到2.ed.ctx中。 |
6 |
=A5.append@ix(A3) |
将A3游标中的数据追加到复组表中。 |
7 |
=create(EID,Defiled,NAME,GENDER).record([0,true,,,1,true,,, 2,false,"BBB","F"]) |
返回序表内容如下: |
8 |
=file("ecd.ctx":[3]) |
|
9 |
=A8.create@yd(#EID,Defiled,NAME,GENDER;3) |
增加分表3.ecd.ctx,Defiled为更新标识字段。 |
10 |
=A9.append@i(A7) |
将A7序表中的记录追加到分表3.ecd.ctx中。 |
11 |
=file("ecd.ctx":[1,2,3]).open() |
打开ecd.ctx复组表文件。 |
12 |
=A11.cursor().fetch() |
将复组表ecd.ctx中的所有数据返回到游标中,数据内容如下:
|
13 |
=A11.cursor@w().fetch() |
使用@w选项,将复组表ecd.ctx返回成游标,识别更新标识,即:EID为1的记录更新标识为true(删除)不返回到游标中; EID为2的记录更新标识为false(修改),更新该记录; EID为0的记录更新标识为true(删除),规定带删除标识且键值唯一的记录会被保留下来,所以该记录会返回到游标中,返回游标数据内容如下: |
描述:
将集群实表/集群内表中的指定列返回成集群游标。
语法:
T.cursor(x,…;wi,...)
备注:
将集群实表/集群内表中的数据经过x计算和过滤条件wi过滤后,返回成集群游标。
选项:
@m |
T.cursor@m(x…;wi,...;n) 生成路数为n的同分布的集群多路游标。 n为正整数,表示分段数, n<2时返回普通游标,n省略则用工具 - 选项中的多路游标缺省路数值。 |
参数:
T |
集群实表/集群内表,T不可以为复写表。 |
x |
表达式。 |
wi |
过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。 |
返回值:
集群(多路)游标
示例:
|
A |
|
1 |
=file("D:/tb4.ctx","169.254.121.62:8281") |
打开集群文件。 |
2 |
=A1.open() |
返回集群组表。 |
3 |
=A2.attach(table3) |
取出集群实表table3。 |
4 |
=A2.cursor() |
返回集群游标。 |
5 |
=A3.cursor(NAME,GENDER;EID<6) |
将EID<6的NAME,GENDER列返回成集群游标。 |
6 |
=file("tb5.ctx","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)
备注:
根据多路游标mcs同步分段实表/内表/复组表T,返回多路游标;用T和mcs的首字段对应同步。T为复组表时,将分表按照维度归并。
参数:
T |
实表/内表/复组表。T不支持为行存组表。 |
x |
表达式。 |
C |
列别名。 |
wi |
过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的字段: 1.K=w w通常使用表达式Ti.find(K)或Ti.pfind(K),Ti为序表,w为null或false时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; 当w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为K在Ti 中的序号。 2.(K1=w1,…Ki=wi,w) Ki=wi为赋值表达式,参数wi通常可以使用表达式Ti.find(Ki)或Ti.pfind(K),Ti为序表;当wi为表达式Ti.find(Ki)且被选出字段C,...中包含Ki时,Ki将被赋值为Ti的指引字段; 当wi为表达式Ti.pfind(Ki)且被选出字段C,...中包含Ki时,Ki将被赋值为Ki在Ti 中的序号。 w为过滤表达式, w中可引用Ki。 3.K:Ti Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。 4.K:Ti:null 符合K:Ti的记录将被过滤掉。 5.K:Ti:# 用序号定位,根据实表中K的值去对比序表Ti的记录序号,对应不上的记录将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。 |
mcs |
由实表生成的多路游标。 |
选项:
@k |
用mcs的首键对应。 |
@v |
生成纯序表列式游标,相较普通游标性能有所提升。 |
@x |
游标取完则自动关闭T。 |
@g |
T为复组表时,如果后续对游标执行group计算,使用@g选项可提升计算速度。 |
@w |
用于带有更新标识的复组表。 按更新机制归并,分表间存在相同键值时,忽略分表号较小的分表中的记录。分段要以第1分表为准。 处理更新标记,有删除标识的记录不返回到游标中,删除标识记录的键值在复组表中是唯一时,该条记录也会被保留。 使用该选项时,强制读出键字段,如果表中有删除标识列,则也会被强制读出。 |
@p |
T为复组表,按照第一个字段归并。 |
返回值:
多路游标
示例:
|
A |
|
1 |
for 100 |
|
2 |
返回序表: |
|
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) |
创建组表的基表。 |
10 |
=A9.append(A5) |
将A5游标中的数据追加到基表中。 |
11 |
=A9.attach(table1,c2) |
在基表上创建附表table1。 |
12 |
=A11.append(A6) |
将A6游标中的数据追加到附表table1中。 |
13 |
=A11.cursor@m(;;2) |
对附表table1进行分段,结果返回多路游标。 |
14 |
=A9.attach(table2,c3) |
在基表上创建附表table2。 |
15 |
=A14.append(A7) |
将A7游标中的数据追加到附表table2中。 |
16 |
=A14.cursor@v(;;A13) |
根据多路游标A13同步分段附表table2。 |
|
A |
|
1 |
=connect("demo").cursor("select EID,NAME from employee") |
|
2 |
=file("emp.ctx") |
生成组表文件。 |
3 |
=A2.create@y(#EID,NAME) |
创建组表的基表。 |
4 |
=A3.append(A1) |
将A1游标中的数据追加到组表基表中。 |
5 |
=A4.cursor@m(;;3) |
将组表生成路数为3的多路游标。 |
6 |
=connect("demo").cursor("select EID,NAME,GENDER,SALARY from employee") |
|
7 |
=file("emp.ctx":[1,2]) |
生成文件组。 |
8 |
=A7.create@y(#EID,NAME,GENDER,SALARY;if(GENDER=="F",1,2)) |
创建复组表。 |
9 |
=A8.append@x(A6) |
将A6游标中的数据追加到复组表中,此时复组表内容如下: |
10 |
=A8.cursor(EID,NAME,GENDER,SALARY;SALARY>5000;A5) |
将复组表根据多路游标A5同步分段,默认归并,返回游标内容如下: 可以看到两个分表中的内容已经按维归并。 |
多种过滤方式:
|
A |
|
1 |
=file("emp.ctx") |
|
2 |
=A1.open() |
打开组表文件。 |
3 |
=A2.import() |
省略参数,返回实表中的所有数据 : |
4 |
=file("emp1.ctx").open().cursor@m(;;2) |
返回多路游标。 |
5 |
=5.new(~:ID,~*~:Num).keys(ID) |
生成ID为键的序表: |
6 |
=A2.cursor(EID,NAME;EID=A5.find(EID);A4) |
使用K=w过滤方式,w是Ti.find(K),实表中使EID=A4.find(EID)计算结果为null或false的记录过滤掉;EID为选出字段,赋值为序表A5的指引字段: |
7 |
=A2.cursor(EID,NAME;EID=A5.pfind(EID);A4) |
使用K=w过滤方式,w是Ti.pfind(K),实表中使EID=A4.pfind(EID)计算结果为null或false的记录过滤掉;EID为选出字段,赋值为EID在序表A5中的序号: |
8 |
=A2.cursor(EID,NAME;EID:A5;A4) |
使用K:Ti过滤方式,用实表中EID的值与序表的键值作对比,匹配不上的将被过滤掉: |
9 |
=A2.cursor(NAME,SALARY;EID:A5;A4) |
K不被选出的情况,EID不是选出字段,仅过滤: |
10 |
=A2.cursor(EID,NAME;EID:A5:null;A4) |
使用K:Ti:null过滤方式,用实表中EID的值与序表的键值作对比,可以匹配上的将被过滤掉: |
11 |
=A2.cursor(EID,NAME;EID:A5:#;A4) |
使用K:Ti:#过滤方式,根据实表中EID的值去对比序表的记录序号,对应不上的记录将被过滤掉: |
12 |
=connect("demo").query("select top 2 NAME,GENDER from employee").keys(NAME) |
返回序表,键为NAME: |
13 |
=A2.cursor(EID,NAME;(EID=A5.find(EID),NAME=A12.find(NAME),EID!=null&&NAME!=null);A4) |
使用(K1=w1,…Ki=wi,w)过滤方式,返回符合所有条件的记录: |
使用@w选项,识别更新标识:
|
A |
|
1 |
=connect("demo").cursor("select EID,NAME from employee") |
|
2 |
=file("e-mcs.ctx") |
生成组表文件。 |
3 |
=A2.create@y(#EID,NAME) |
创建组表的基表。 |
4 |
=A3.append(A1) |
将A1游标中的数据追加到组表基表中。 |
5 |
=A4.cursor@m(;;3) |
将组表生成路数为3的多路游标。 |
6 |
=connect("demo").cursor("select EID,NAME,GENDER from employee") |
|
7 |
=A6.derive(:Defiled) |
|
8 |
=A7.new(EID,Defiled,NAME,GENDER) |
返回游标,内容如下: |
9 |
=file("ecd.ctx":[1,2]) |
文件组1.ecd.ctx、2.ecd.ctx。 |
10 |
=A9.create@yd(#EID,Defiled,NAME,GENDER;if(GENDER=="F",1,2)) |
创建复组表,EID为键,使用@d选项,将Defiled作为更新标识字段,GENDER值为F的记录分到1.ed.ctx中,其余分到2.ed.ctx中。 |
11 |
=A10.append@ix(A8) |
将A3游标中的数据追加到复组表中。 |
12 |
=create(EID,Defiled,NAME,GENDER).record([0,true,,,1,true,,, 2,false,"BBB","F"]) |
返回序表内容如下: |
13 |
=file("ecd.ctx":[3]) |
|
14 |
=A13.create@yd(#EID,Defiled,NAME,GENDER;3) |
增加分表3.ecd.ctx,Defiled为更新标识字段。 |
15 |
=A14.append@i(A12) |
将A12序表中的记录追加到分表3.ecd.ctx中。 |
16 |
=file("ecd.ctx":[1,2,3]).open() |
|
17 |
=A16.cursor(;;A5) |
将复组表ecd.ctx根据A5同步分段,返回多路游标。 |
18 |
=A17.fetch() |
读取游标中的数据: |
19 |
=A16.cursor@w(;;A5) |
使用@w选项,将复组表ecd.ctx根据A5分段,返回成游标多路游标,识别更新标识,即: EID为1的记录更新标识为true(删除)不返回到游标中; EID为2的记录更新标识为false(修改),更新该记录; EID为0的记录更新标识为true(删除),规定带删除标识且键值唯一的记录会被保留下来,所以该记录会返回到多路游标中。 |
20 |
=A19.fetch() |
读取游标中的数据: |
描述:
根据集群多路游标同步分段集群实表,返回集群多路游标。
语法:
T.cursor(x:C,…;wi,...;mcs)
备注:
根据集群多路游标mcs同步分段集群实表T,返回集群多路游标;用T的维和mcs的键对应同步,T和mcs分布方式必须一致。在同步分段集群实表时需要分段字段一致。在使用多个集群实表时,需要避免分段的不同步,此时就可以使用集群多路游标同步。
参数:
T |
集群实表。 |
x |
表达式。 |
C |
列别名。 |
wi |
过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。 |
mcs |
由集群实表生成的集群多路游标。 |
返回值:
集群多路游标
示例:
|
A |
|
1 |
=file("cs1.ctx","169.254.121.62:8281") |
|
2 |
=A1.open() |
打开集群组表。 |
3 |
=A2.attach(table1) |
取出集群实表table1。 |
4 |
=A3.cursor@m(;;2) |
返回集群多路游标。 |
5 |
=A2.attach(table2) |
|
6 |
=A5.cursor(;;A4) |
集群实表table2根据集群实表table1多路游标同步分段,table1与table2的分段字段需要一致。 |
描述:
从虚表对象中取出游标。
语法:
T.cursor(xi:Ci,…)
备注:
从虚表T中取出游标,xi为字段表达式,Ci为游标中的字段名,缺省为虚表的字段名,xi:Ci省略时取出所有字段。
参数:
T |
虚表。 |
xi |
字段表达式。 |
Ci |
结果序表的字段名。 |
选项:
@v |
组表第一次加载时用列式,提升性能。 |
游标
|
A |
|
1 |
=create(file).record(["D:/file/pseudo/empT.ctx"]) |
|
2 |
=pseudo(A1) |
生成虚表对象。 |
3 |
=A2.cursor() |
从虚表中取出游标,无参数时取出所有字段。 |
4 |
=A3.fetch() |
游标中的数据内容: |
5 |
=A2.cursor(EID:eid,NAME,SALARY:salary) |
从虚表中取出游标,取出字段包含EID、NAME、SALARY,列名为eid、NAME、salary。 |
6 |
=A5.fetch() |
游标中的数据内容: |
描述:
多路游标归并转成n路游标。
语法:
mcs.cursor(n)
备注:
多路游标归并转成n路游标,n比原来的路数小,缺省转成单路游标。
参数:
mcs |
多路游标。 |
n |
列名。 |
返回值:
单路游标/多路游标
示例:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE").cursor@m(5) |
返回多路游标,路数为5。 |
2 |
=A1.cursor(3) |
将多路游标归并转成3路游标。 |
3 |
=A2.cursor() |
将多路游标转为单路游标。 |