cursor()

阅读(2089) 标签: 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都省略时表示取全集

选项:

@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相同的分到一起,并不是严格的按照参数kn分配

A.cursor@m(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相同的记录分到两段中

A.cursor@m(mcs,K:K’,...)

描述:

用序列生成与多路游标mcs同步分段的多路游标

语法:

A.cursor@m(mcs,K:K‘,...)

备注:

将有序序列A按多路游标mcs同步分段,返回多路游标,KK’分别为Amcs的分段键

参数:

A

有序序列

mcs

多路游标

K

A的分段键

K’

mcs的分段键

选项:

@p

只按mscA的第一个字段对比分段,忽略参数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同步分段的多路游标,分段键分别为k1c1

5

=A3.cursor@mp(A2)

A3序表生成与A2同步分段的多路游标,使用@p选项,使用A3A2的第一个字段对比分段,此时表达式中无需分段键参数

db.cursor()

描述:

根据sql创建数据库游标。

语法:

db. cursor(sql {,args …})

 

备注:

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

参数:

db

数据源连接

数据库连接

sql

sql查询语句

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

args

传递给sql的参数;可以是参数值,也可以是定义过的参数名称,多个参数之间用逗号分隔

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

选项:

@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为网格参数,参数值为100arg2A1格中定义的参数,第三个参数直接传递参数值为“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

 

相关概念:

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表示路数,缺省使用设计器中设置的【多路游标缺省路数】值作为路数,第三方应用程序中集成使用时,缺省路数为raqsoftConfig.xml文件中配置的cursorParallelNum的值

@o

用引号作为转义符

@k

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

@d

行内有数据不匹配类型和格式时删除该行,此时会按type检查类型@p@q时括号和引号不匹配时也删除该行

@n

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

@v

@d@n检查出错时抛出违例,中断程序,输出出错行的内容

@w

把每行读成序列,结果为序列的序列构成的游标,列名也算作一行

@a

将单引号作为引号处理,缺省不处理,与@q组合使用时也是将单引号作为引号处理

@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内容以斜杠分隔,按照指定字段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@cqo()

=A21.fetch()

Dep3.txt文件内容:

使用@o选项,串中两个引号表示一个引号,返回结果:

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行列数与第一行不匹配,故忽略

 

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选项,直接用分隔符拆成串

 

相关概念:

cs.fetch()

cs.skip()

db.cursor()

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

描述:

将实表/内表/复组表分段后返回指定段的游标

语法:

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

备注:

把实表/内表/复组表的数据经过x计算和过滤表达式wi过滤后,分成n段,返回第k段的游标,C为结果字段名。从附表中查询的数据也可以包括主表中的字段。

T为复组表时,所有分表同步分段,结果按维度归并,即先将分表号为1的表分成n段,然后其余分表根据分表1同步分段,最终取各分表的第k段数据按维度归并后返回。

选项:

@m

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

@v

生成纯序表列式游标,相较普通游标性能有所提升。

@x

游标取完则自动关闭T

@o

T为复组表时不做归并,直接按顺序取,所有分表统一分段

@w

用于复组表。

按更新机制归并,分表间存在相同键值时,忽略分表号较小的分表中的记录。分段要以第1分表为准,后面有些分表可能非常小可先全读。

处理删除标记,有删除标记的记录不返回到游标中,删除标记记录的键值在复组表中是唯一时,该条记录也会被保留。

使用该选项时,强制读出键字段,如果表中有删除标识列,则也会被强制读出。

参数:

T

实表/内表/复组表

x

表达式

C

列别名,可省略

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的字段:

1K=w

w通常使用表达式Ti.find(K)Ti.pfind(K)Ti为序表,wnullfalse时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为KTi 中的序号。

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将被赋值为KiTi 中的序号。

w为过滤表达式,w中可引用Ki

3K:Ti

Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

4K:Ti:null

符合K:Ti的记录将被过滤掉。

5K:Ti:#

用序号定位,根据实表中K的值去对比序表Ti的记录序号,对应不上的记录将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

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)

为组表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()

获取游标中的数据

b

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选项将附表table4生成多路游标

 

 

A

 

1

=file("employee1.ctx")

生成组表文件employee1.ctx

2

=A1.create@y(#EID,NAME,GENDER,SALARY)

创建组表employee1.ctx的基表,EIDNAMEGENDERSALARY为基表的列名,其中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的数据已经按维归并。

6

=A3.cursor@o(;;1:3)

使用@o选项,复组表不做归并,直接按分段顺序取数,返回游标内容如下:

可以看到上半部分是分表1.nc.ctx中的内容,下半部分是分表2.nc.ctx中的内容

 

多种过滤方式

 

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过滤方式,wTi.find(K),实表中使EID=A4.find(EID)计算结果为nullfalse的记录过滤掉;EID为选出字段,赋值为序表A4的指引字段

6

=A2.cursor(EID,NAME;EID=A4.pfind(EID))

使用K=w过滤方式,wTi.pfind(K),实表中使EID=A4.pfind(EID)计算结果为nullfalse的记录过滤掉;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)过滤方式,返回符合所有条件的记录

使用@w选项,按更新机制归并:

 

A

 

1

=connect("demo").cursor("select  EID,NAME,GENDER  from employee") 

返回游标,内容如下:

2

=file("ec.ctx":[1,2])

文件组1.ec.ctx2.ec.ctx

3

=A2.create@y(#EID,NAME,GENDER;if(GENDER=="F",1,2))

创建复组表,EID为键,GENDER值为F的记录分到1.ec.ctx中,其余分到2.ec.ctx

4

=A3.append@ix(A1)

A1游标中的数据追加到复组表中

5

=create(EID,NAME,GENDER).record([1,"AAA","M"]).cursor()

返回游标,内容如下:

6

=file("ec.ctx":[3])

 

7

=A6.create@y(#EID,NAME,GENDER;3)

增加分表3.ec.ctx

8

=A7.append@i(A5)

A5游标中的内容追加到分表3.ec.ctx中,此时分表1.ec.ctx3.ec.ctx中都存在主键为[1]的记录

9

=file("ec.ctx":[1,2,3]).open()

打开复组表ec.ctx

10

=A9.cursor(;;1:3)

将复组表分段后取出第1段,返回游标,游标内容如下:

11

=A9.cursor@w(;;1:3)

使用@w选项,按照更新机制归并,返回游标内容如下:

 

使用@w选项,识别删除标识:

 

A

 

1

=connect("demo").cursor("select  EID,NAME,GENDER  from employee") 

 

2

=A1.derive(false:Defiled)

 

3

=A2.new(EID,Defiled,NAME,GENDER)

返回游标,内容如下:

4

=file("ecd.ctx":[1,2])

文件组1.ecd.ctx2.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([2,true,,,0,true,,]).cursor()

返回游标,内容如下:

8

=file("ecd.ctx":[3])

 

9

=A8.create@yd(#EID,Defiled,NAME,GENDER;3)

增加分表3.ecd.ctxDefiled为删除标识字段

10

=A9.append@i(A7)

A1游标中的记录追加到分表3.ecd.ctx中,此时主键为2的记录中删除标识字段值为true,增加的主键值为0记录是原先分表中没有的,即带删除标识的键值唯一的记录

11

=file("ecd.ctx":[1,2,3]).open()

打开ecd.ctx复组表文件

12

=A11.cursor().fetch()

将复组表ecd.ctx中的所有数据返回到游标中,数据内容如下:

13

=A11.cursor@w().fetch()

使用@w选项,将复组表ecd.ctx返回成游标,识别删除标识,即主键为2的记录不返回到游标中,带删除标识的键值唯一的记录会被保留下来,即主键为0的记录会返回到游标中,数据内容如下:

 

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

描述:

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

语法:

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<6NAME,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)

描述:

根据多路游标同步分段实表/内表/复组表返回多路游标

语法:

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

备注:

 

根据多路游标mcs同步分段实表/内表/复组表T,返回多路游标;用Tmcs的首字段对应同步。T为复组表时,将分表按照维度归并。

参数:

T

实表/内表/复组表

x

表达式

C

列别名

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的字段:

1K=w

w通常使用表达式Ti.find(K)Ti.pfind(K)Ti为序表,wnullfalse时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为KTi 中的序号。

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将被赋值为KiTi 中的序号。

w为过滤表达式, w中可引用Ki

3K:Ti

Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

4K:Ti:null

符合K:Ti的记录将被过滤掉。

5K:Ti:#

用序号定位,根据实表中K的值去对比序表Ti的记录序号,对应不上的记录将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

mcs

由实表生成的多路游标

选项:

@k

mcs的首键对应

@v

生成纯序表列式游标,相较普通游标性能有所提升。

@x

游标取完则自动关闭T

@o

T为复组表时不做归并,直接按分表顺序取数

@w

用于复组表。

按更新机制归并,分表间存在相同键值时,忽略分表号较小的分表中的记录。分段要以第1分表为准,后面有些分表可能非常小可先全读。

处理删除标记,有删除标记的记录不返回到游标中,删除标记记录的键值在复组表中是唯一时,该条记录也会被保留。

使用该选项时,强制读出键字段,如果表中有删除标识列,则也会被强制读出。

 

返回值:

多路游标

示例:

 

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)

创建组表的基表

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

 

T为复组表时

 

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同步分段,默认归并,返回游标内容如下:

可以看到两个分表中的内容已经按维归并

11

=A8.cursor@o(EID,NAME,GENDER,SALARY;SALARY>5000;A5)

使用@o选项不归并,直接按照分表顺序取数

可以看到上半部分是分表1中的内容,下半部分是分表2中的内容

 

多种过滤方式

 

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过滤方式,wTi.find(K),实表中使EID=A4.find(EID)计算结果为nullfalse的记录过滤掉;EID为选出字段,赋值为序表A5的指引字段

7

=A2.cursor(EID,NAME;EID=A5.pfind(EID);A4)

使用K=w过滤方式,wTi.pfind(K),实表中使EID=A4.pfind(EID)计算结果为nullfalse的记录过滤掉;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

=file("ec.ctx":[1,2])

文件组1.ec.ctx2.ec.ctx

8

=A7.create@y(#EID,NAME,GENDER;if(GENDER=="F",1,2))

创建复组表,EID为键,GENDER值为F的记录分到1.ec.ctx中,其余分到2.ec.ctx

9

=A8.append@ix(A6)

A1游标中的数据追加到复组表中

10

=create(EID,NAME,GENDER).record([1,"AAA","M"]).cursor()

返回游标,内容如下:

11

=file("ec.ctx":[3])

 

12

=A11.create@y(#EID,NAME,GENDER;3)

增加分表3.ec.ctx

13

=A12.append@i(A10)

A5游标中的内容追加到分表3.ec.ctx中,此时分表1.ec.ctx3.ec.ctx中都存在主键为[1]的记录

14

=file("ec.ctx":[1,2,3]).open()

打开复组表ec.ctx

15

=A14.cursor(;;A5).fetch()

根据多路游标A5同步分段复组表,游标内容如下:

16

=A14.cursor@w(;;A5).fetch()

使用@w选项,使用@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(false:Defiled)

 

8

=A7.new(EID,Defiled,NAME,GENDER)

返回游标,内容如下:

9

=file("ecd.ctx":[1,2])

文件组1.ecd.ctx2.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([2,true,,,0,true,,]).cursor()

返回游标,内容如下:

13

=file("ecd.ctx":[3])

 

14

=A13.create@yd(#EID,Defiled,NAME,GENDER;3)

增加分表3.ecd.ctxDefiled为删除标识字段

15

=A14.append@i(A12)

A1游标中的记录追加到分表3.ecd.ctx中,此时主键为2的记录中删除标识字段值为true,增加的主键值为0的记录是原先分表中没有的

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分段,返回成游标多路游标,识别删除标识,即主键为2的记录不返回到游标中,带删除标识的键值唯一的记录会被保留下来,即主键为0的记录会返回到游标中,数据内容如下:

20

=A19.fetch()

读取游标中的数据

 

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

描述:

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

语法:

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

备注:

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

参数:

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)

取出集群实表table2

6

=A5.cursor(;;A4)

集群实表table2根据集群实表table1多路游标同步分段,table1table2的分段字段需要一致。

 

T.cursor()

描述:

从虚表对象中取出游标

语法:

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)

从虚表中取出游标,取出字段包含EIDNAMESALARY,列名为eidNAMEsalary

6

=A5.fetch()

游标中的数据内容

 

 

mcs.cursor(n)

描述:

多路游标归并转成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()

将多路游标转为单路游标