集算器对数据库的操作
集算器可以从数据库中读取数据,可以将数据写入数据库,也可以调用数据库的存储过程。基于这三种基本操作,集算器可以应用在多种数据库相关的场景任务:
1、 数据分析和展现任务,其过程是:
通过sql或者存储过程,从数据库读入数据。
从其他数据源(其他数据库、文件、hdfs、nosql数据库、http数据源、json数据源等)读入数据。
将异构数据统一进行处理
提供给应用程序或者报表展现。
2、 类似ETL的批处理任务。
过程和分析展现任务类似,所不同的是最后一步数据不是用来展现,而是写入其他数据库或者其他数据源。
3、 对本数据库进行批量修改任务。
一个方法是从本数据库读入数据,处理之后回写入本数据库;还有一个办法是利用sql或者存储过程直接处理数据库的数据。
下面我们具体看一下三种基本操作的例子。
一、从数据库中读入数据。
上图中A1单元格连接上了一个名为demo的hsql数据库,A2单元使用sql语句查询了employee表,作为集算器的序表存入了A2单元格这个变量中,arg1是外部传入的参数。A3单元格关闭了数据库连接,A4单元格对外返回查询结果。集算器的集成开发环境右下角红框中可以显示demo数据库的表名、字段名,可以方便程序员书写sql语句。
二、向数据库写入数据。
集算器可以方便的实现增删改,最简单的写法如下:
上图中的A2到A4分别实现了插入、修改和删除。每条sql执行之后自动提交。需要说明的是:
1、3条语句提交了3次,对数据库操作比较频繁。
2、三条sql没有事务关系,后续的sql如果执行失败,并不影响前面的sql。
集算器也可以直接使用序表来批量更新,例如:从students.txt文件中导入学生信息,用来更新数据库中的students1表,由于有很多记录需要修改,所以使用批量提交数据库的方式比较合理。
A1:定义一个文件对象,文件中保存的是学生信息。
A2:导入文件内容。
A3:使用A2中的学生信息,批量修改学生表1的内容。这里是使用批量提交sql的方式,可以避免频繁访问数据库。同时,能够保证整批数据同时成功写入或失败,即数据的一致性。
集算器还可以处理多条sql构成一个完整数据库事务的情况,例如:我们要新增一个学生,插入数据之后,要将学生的id修改为9。为了保证数据一致性,插入和修改都成功之后才能提交,否则就要回滚。
A1:连接数据库。注意connect函数使用了@e选项,出错时返回错误信息由后边的代码自行处理。如果不用这个选项,数据库出错的时候会直接结束集算器程序。
A2:执行插入sql语句。注意,execute使用了@k选项,表示执行结束后并不提交事务。如果不使用的话,就直接提交这个插入语句了。
A3:取得上一条数据库操作,也就是插入语句执行的结果,如果是err变量是0的话就代表执行成功,否则就是错误代码。
A4:判断执行结果err变量是否为0,如果是0代表上一条插入语句已经成功,就执行B4中的修改操作。
C4:取得修改sql执行的结果。
A5:判断err变量,如果是0的话就提交数据库,否则就回滚。
A6:关闭数据库连接。
三、调用存储过程。
对于没有返回参数的存储过程,集算器的调用方法比较简单:
A1:连接数据库。
A2:调用存储过程,输出参数值为4。
对于返回结果集的存储过程,集算器可以这样调用:
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表的结果集)。
A4、A5单元格分别使用A2中的输出变量a、b来获取存储过程对应的执行结果,a对应emp表的数据,赋值给A3,b对应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;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。