集算器可以从数据库中读取数据,可以将数据写入数据库,也可以调用数据库的存储过程。基于这三种基本操作,集算器可以应用在多种数据库相关的场景任务:

    1、  数据分析和展现任务,其过程是:

  1. 通过sql或者存储过程,从数据库读入数据。

  2. 从其他数据源(其他数据库、文件、hdfsnosql数据库、http数据源、json数据源等)读入数据。

  3. 将异构数据统一进行处理

  4. 提供给应用程序或者报表展现。

    2、  类似ETL的批处理任务。

    过程和分析展现任务类似,所不同的是最后一步数据不是用来展现,而是写入其他数据库或者其他数据源。

    3、  对本数据库进行批量修改任务。

    一个方法是从本数据库读入数据,处理之后回写入本数据库;还有一个办法是利用sql或者存储过程直接处理数据库的数据。

    下面我们具体看一下三种基本操作的例子。

    

一、从数据库中读入数据。

wKiom1QZJsvgo6x4AAGzqjgE34k383.jpg

上图中A1单元格连接上了一个名为demohsql数据库,A2单元使用sql语句查询了employee表,作为集算器的序表存入了A2单元格这个变量中,arg1是外部传入的参数。A3单元格关闭了数据库连接,A4单元格对外返回查询结果。集算器的集成开发环境右下角红框中可以显示demo数据库的表名、字段名,可以方便程序员书写sql语句。

 

二、向数据库写入数据。

集算器可以方便的实现增删改,最简单的写法如下:

wKioL1QZJuXTW7cAAACvv3qaNGw141.jpg

上图中的A2A4分别实现了插入、修改和删除。每条sql执行之后自动提交。需要说明的是:

13条语句提交了3次,对数据库操作比较频繁。

2、三条sql没有事务关系,后续的sql如果执行失败,并不影响前面的sql

集算器也可以直接使用序表来批量更新,例如:从students.txt文件中导入学生信息,用来更新数据库中的students1表,由于有很多记录需要修改,所以使用批量提交数据库的方式比较合理。

wKiom1QZJtDgyt1gAAC--YWt0CI058.jpg

A1:定义一个文件对象,文件中保存的是学生信息。

A2:导入文件内容。

A3:使用A2中的学生信息,批量修改学生表1的内容。这里是使用批量提交sql的方式,可以避免频繁访问数据库。同时,能够保证整批数据同时成功写入或失败,即数据的一致性。

集算器还可以处理多条sql构成一个完整数据库事务的情况,例如:我们要新增一个学生,插入数据之后,要将学生的id修改为9。为了保证数据一致性,插入和修改都成功之后才能提交,否则就要回滚。

wKioL1QZJuvjHop0AADNWlHqNpk372.jpg

A1:连接数据库。注意connect函数使用了@e选项,出错时返回错误信息由后边的代码自行处理。如果不用这个选项,数据库出错的时候会直接结束集算器程序。

A2:执行插入sql语句。注意,execute使用了@k选项,表示执行结束后并不提交事务。如果不使用的话,就直接提交这个插入语句了。

A3:取得上一条数据库操作,也就是插入语句执行的结果,如果是err变量是0的话就代表执行成功,否则就是错误代码。

A4:判断执行结果err变量是否为0,如果是0代表上一条插入语句已经成功,就执行B4中的修改操作。

C4:取得修改sql执行的结果。

A5:判断err变量,如果是0的话就提交数据库,否则就回滚。

A6:关闭数据库连接。

    三、调用存储过程。

对于没有返回参数的存储过程,集算器的调用方法比较简单:

wKiom1QZJtSAoxuYAAAv6hmFqSE962.jpg

A1:连接数据库。

A2:调用存储过程,输出参数值为4

对于返回结果集的存储过程,集算器可以这样调用:

wKioL1QZJvHzPw9jAABq0AuGJpk344.jpg

A2单元格使用proc函数调用存储过程:orac.proc("{callproAA(?,?)}",:101:"o":a,:101:"o":b),返回了两个结果集(序表),组成了一个序表的集合:序列,赋值给了A1。下面依次解释一下proc行数的输入参数:

    1)  sql字符串

    "{call proAA(?,?)}"中包含调用存储过程的名字,问号表示sql的参数。

    2)  输出参数1

    :101:"o":a中定义了一个输出参数,101代表其数据类型是游标(其他类型参见附录),”o”代表这个参数是输出参数。a是定义了一个变量,可以用这个变量引用返回结果。

    3)  输出参数2

    :101:"o":b中定义了一个输出参数,101代表其数据类型是游标,”o”代表这个参数是输出参数。b是定义了一个变量,可以用这个变量引用返回结果。

    A3单元格返回了A2单元格的第一个序表(emp表的结果集)。

    A4A5单元格分别使用A2中的输出变量ab来获取存储过程对应的执行结果,a对应emp表的数据,赋值给A3b对应test表的数据,赋值给A4

附录:参数类型定义

type的取值为:

    public final static byte DT_DEFAULT =(byte) 0; //默认,自动识别

         public final static byte DT_INT =(byte) 1;

         public final static byte DT_LONG =(byte) 2;

         public final static byte DT_SHORT =(byte) 3;

         public final static byte DT_BIGINT =(byte) 4;

         public final static byte DT_FLOAT =(byte) 5;

         public final static byte DT_DOUBLE =(byte) 6;

         public final static byte DT_DECIMAL =(byte) 7;

public finalstatic byte DT_DATE = (byte) 8;

         public final static byte DT_TIME =(byte) 9;

         public final static byte DT_DATETIME =(byte) 10;

         public final static byte DT_STRING =(byte) 11;

         public final static byte DT_BOOLEAN =(byte) 12;

 

         public final static byte DT_INT_ARR =(byte) 51;

         public final static byte DT_LONG_ARR =(byte) 52;

         public final static byte DT_SHORT_ARR =(byte) 53;

         public final static byte DT_BIGINT_ARR= (byte) 54;

         public final static byte DT_FLOAT_ARR =(byte) 55;

         public final static byte DT_DOUBLE_ARR= (byte) 56;

         public final static byte DT_DECIMAL_ARR= (byte) 57;

 

         public final static byte DT_DATE_ARR =(byte) 58;

         public final static byte DT_TIME_ARR =(byte) 59;

         public final static byteDT_DATETIME_ARR = (byte) 60;

         public final static byte DT_STRING_ARR= (byte) 61;

         public final static byte DT_BYTE_ARR =(byte) 62;

         public final static byte DT_CURSOR =(byte) 101;

         public final static byteDT_AUTOINCREMENT = (byte) 102;