6.2.4直接执行语句

JAVA程序中使用集算器时,除了调用一个网格文件,还可以直接执行语句。实际上,调用网格文件,也可以作为call语句直接执行。在这里我们详细了解一下如何直接执行其它语句。如:

  //直接执行语句,返回结果集

  st = con.createStatement();

  ResultSet rs1 = st.executeQuery("=age(date(\"1/1/1990\"))");

  ResultSet rs2 = st.executeQuery("=5.(~*~)"); 

这里用executeQuery方法直接执行以=开头的集算器表达式,并将表达式的计算结果返回为结果集,注意表达式中的双引号需要在前面添加转义符。如果仍然用前面类似的代码将结果集输出,结果如下:

可以注意到如果返回的结果为序列,那么在JDBC中会返回1列多行的结果集。也可以用另外的方法调用:

  //先判断是否有结果集,再获取结果

  boolean hasResult1 = st.execute("=age(date(\"1/1/1990\"))");

  ResultSet rs1,rs2;

  if (hasResult1) {

  rs1 = st.getResultSet();

  }

  boolean hasResult2 = st.execute("=5.(~*~)"); 

  if (hasResult2) {

  rs2 = st.getResultSet();

  }

使用execute方法时,会根据执行的语句返回是否有结果集,代码的效果和前面是相同的。

如果需要在语句中使用参数,可以使用(x1, x2,…)操作符,依次计算表达式,并返回最后一个的结果,如:

  st =con.createStatement();

  ResultSet rs1 = st.executeQuery("=(pi=3.14,r=4,r*r*pi)");

计算圆的面积,输出结果集如下:

 

在执行语句时,语句中可以使用参数,按照PreparedStatement中的设定顺序,在语句中用固定的名称arg1,arg2,…等调用。如:

  PreparedStatement pst = con.prepareStatement("=arg1*arg1*arg2");

  pst.setObject(1,3);

  pst.setObject(2,3.14);

  ResultSet rs = pst.executeQuery();

计算半径为3的圆面积,输出结果集如下:

 

在集算器JDBC中还可以使用$开头的数据集查询语句。如:

  //执行数据库查询语句

  st = con.createStatement();

  ResultSet rs1 = st.executeQuery("$(demo) select * from CITIES where POPULATION > 2000000");

注意此时使用的数据集demo,需要在配置中设为自动连接。结果如下:

 

在调用网格文件时,可以使用文件名,而省略call,如:

  st =con.createStatement();

  boolean hasResult1 = st.execute("createTable3 30,\"California\"");

执行时,会调用网格文件createTable3.dfx。如果文件中需要设入参数,参数需要在语句中写定,且与文件名之间用空格分隔。上面语句执行后,同样能够返回多结果集,结果和前面是相同的:

JDBC中,还可以执行一片多行多列的网格代码。执行时,需要将代码拼为一个字符串,行之间用\n分隔,同一行的各列之间用\t分隔。如:

  ResultSet rs = st.executeQuery("=[1,1]\nfor 10\t>A1=A1|(A1.m(-1)+A1.m(-2))\nreturn A1");");

执行这个字符串时,相当于计算下面的网格:

 

A

B

1

=[1,1]

 

2

for 10

>A1=A1|(A1.m(-1)+A1.m(-2))

3

return A1

 

如果将得到的ResultSet输出,则结果如下: