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

阅读(610) 标签: 多路游标, 分段, 实表,

描述:

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

语法:

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()

读取游标中的数据: