SQL+

阅读(347) 标签: sql+,

本节内容,非应用程序员可以跳过,不影响正常阅读。

SQL+是在常规SQL基础上,增加了注释标记的查询语言,可视为将SQL转换到SPL的媒介。它与原SQL语句在语义上等价,可直接在数据库中执行。

SQL+SQL语法类似,但SQL+只支持在集文件(默认扩展名为btx)和组表(默认扩展名为ctx)中查询。有关组表的结构和使用,请查看11 组表

最简单的 SQL+

先用最简单的SQL+来了解一下它的原理和使用方法。为了便于和数据库中的SQL作对比,在下面的例子中,先用demo数据库中的表EMPLOYEESTATES来生成集文件b_emp.btxb_st.btx

 

A

1

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

2

>file("d_emp.btx").export@b(A1)

3

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

4

>file("d_st.btx").export@b(A3)

从一个btx文件中查询全部数据,可以用下面的SQL+语句:

select * from b_st.btx

除了表名直接写为btx文件名之外,这个SQL+语句和SQL看起来是相同的。文件名可以直接使用绝对路径,如果直接写文件名,将在主路径及寻址路径中查找。

使用工具程序可利用SQL+中的标记将其转换成SPL。在工具栏中选择File>Import SQL(+)可以打开工具程序:

 

在工具程序中输入SQL+语句:

确认后,就可将SQL+语句转换为对应的SPL代码:

 

A

B

1

=file("D:/files/txt/b_st.btx").cursor@b().fetch()

 

2

 

 

生成的SPL有可能需要做进一步的手工优化和调试,因此会多出一个空行和一个空列,以便于编辑。SPL执行后,A1中的结果如下:

这和从数据库表中用SQL查询到的结果是相同的。

 

如果仅在表中选择某几个字段,也可以使用类似SQL+的语法,如:

转为SPL如下:

 

A

B

1

=file("D:/files/txt/b_st.btx").cursor@b(STATEID,NAME,ABBR,CAPITAL).fetch()

 

2

 

 

执行结果如下:

可以看到,结果和前面章节中用SQL在数据库中查询的结果是相同的。

 

SQL+中,同样也可以做多表连接等处理,如:

这里的SQL+也可以写为:select e.NAME, e.GENDER, s.ABBR from b_emp.btx e, b_st.btx s where e.STATE = s.NAME,效果是相同的。转换为的SPL如下:

 

A

B

1

=file("D:/files/txt/b_emp.btx").cursor@b(STATE,NAME,GENDER).fetch()

 

2

=file("D:/files/txt/b_st.btx").cursor@b(ABBR,NAME).fetch()

 

3

=join(A1:L,STATE;A2:R,NAME)

 

4

>$1=A3.new(L.STATE:e_STATE,L.NAME:e_NAME,L.GENDER:e_GENDER,R.ABBR:s_ABBR,R.NAME:s_NAME)

 

5

=$1.new(e_NAME:e_NAME,e_GENDER:e_GENDER,s_ABBR:s_ABBR)

 

6

 

 

自动生成的SPL有时还可以手工优化,获得更佳的效率,如上面的SPL中,不必先计算出A4中的过渡结果,可以优化如下:

 

A

B

1

=file("D:/files/txt/b_emp.btx").cursor@b(STATE,NAME,GENDER).fetch()

 

2

=file("D:/files/txt/b_st.btx").cursor@b(ABBR,NAME).fetch()

 

3

=join(A1:L,STATE;A2:R,NAME)

 

4

=A3.new(L.NAME:e_NAME,L.GENDER:e_GENDER,R.ABBR:s_ABBR)

 

5

 

 

执行结果如下:

结果类似于在数据库中执行下面的SQL

 

A

1

=demo.query("select e.NAME, e.GENDER, s.ABBR from employee e join states s on e.STATE = s.NAME")

A1中结果如下:

可以看到,和SQL+转换的SPL相比,得到的结果字段名不同,记录的顺序也可能有差别。

在 SQL+ 中使用标记

SQL+并非和SQL的语法全部一致,如在前面一节中,直接使用文件名作为表名,而文件名中通常是包含扩展名的,如果再需要利用表名引用字段,就会遇到麻烦了,如无法将SQL写成下面的样子:

select b_emp.btx.NAME as Name, b_emp.btx.GENDER as Gender from b_emp.btx

SQL+中,可以添加一些用注释格式写的标记,来支持更多的功能,如上面的代码可以添加标记后改写如下:

添加/*+BTX*/标记后,将标记b_empbtx格式且置于主目录中的集文件表,并可以用b_emp作为表名在SQL+语句中使用,上面的SQL+转换为SPL后如下:

 

A

B

1

=file("D:/files/txt/b_emp.btx").cursor@b(NAME,GENDER).fetch()

 

2

=A1.new(NAME:Name,GENDER:Gender)

 

3

 

 

执行查询后A2中结果如下:

标记能够实现一些比较复杂的计算,如:

在上面的SQL+中,用/*var(v)*/标记,将括号中的计算结果在SPL中定义为变量使用。转换为的SPL如下:

 

A

B

1

=file("D:/files/txt/b_st.btx").cursor@b(NAME).fetch()

 

2

=file("F:/files/txt/b_emp.btx").cursor@b(EID,STATE).fetch()

 

3

=A2.groups(STATE:group_1;count(EID):count_1)

 

4

>v=A3.new(count_1:$17,group_1:STATE)

 

5

>v=if(ift(v),v,create($17,STATE).insert@r(0:v))

 

6

>v=v.keys(STATE).index()

 

7

>$18=A1.derive(v.find(~.NAME).(#1):$17)

 

8

=$18.new(NAME:State,$17: count)

 

9

 

 

计算结果如下:

 

SQL+中能够使用的标记很多,这里仅略作介绍。除了标记之外,SQL+中还能够使用一些特殊的语法,如firstmedian等。如需了解更多内容,请阅读函数参考及SQL+的详细文档。

直接执行 SQL+

SQL+有两种工作方式:翻译或执行。前面的例子都是将SQL+翻译为SPL;此外还可通过JDBCODBC调用,直接运行算出结果。

JDBC中调用时,类似于在JDBC中直接执行语句,如:

public void testDataServer(){

Connection con = null;

java.sql.PreparedStatement st;

try{

//建立连接

Class.forName("com.esproc.jdbc.InternalDriver");

//根据url获取连接,使用SQL+时,需要添加选项sqlfirst=plus

con= DriverManager.getConnection("jdbc:esproc:local://?sqlfirst=plus");

st =con.prepareCall("call createTable1()");

//直接执行SQL+语句,获取结果集

ResultSet rs1 = st.executeQuery("select b_emp.NAME as Name, b_emp.GENDER as Gender from b_emp/*+BTX*/ where b_emp.ID < 6");

//简单处理结果集,将结果集中的字段名与数据输出

ResultSetMetaData rsmd = rs.getMetaData();

int colCount = rsmd.getColumnCount();

for ( int c = 1; c <= colCount;c++) {

String title = rsmd.getColumnName(c);

if ( c > 1 ) {

System.out.print("\t");

}

else {

System.out.print("\n");

}

System.out.print(title);

}

while (rs.next()) {

for (int c = 1; c<= colCount; c++) {

if ( c > 1 ) {

System.out.print("\t");

}

else {

System.out.print("\n");

}

Object o = rs.getObject(c);

System.out.print(o.toString());

}

}

}

catch(Exception e){

System.out.println(e);

}

finally{

//关闭连接

if (con!=null) {

try {

con.close();

}

catch(Exception e) {

System.out.println(e);

}

}

}

}

JDBC中调用SQL+时,需要在连接串中添加sqlfirst=plus,在执行时可以直接使用SQL+语句,而不必再去翻译为SPL。注意,SQL+中使用到的集文件或者组表文件,需要放置在主目录中。上面代码的执行结果如下:

ODBC中使用SQL+时,需要在集算器ODBC配置中,将SqlFirst属性配置为plus