程序里要在数据库之间搬动数据用什么文件中介?

 

数据库之间搬动数据,需要先将源数据导出到中介文件后,或对文件中的数据进行修改,再导入到目标数据库。使用文本文件(txt/csv)最常见,其通用性强且没有内容大小的限制,但是会丢失数据类型,读数时还需要做类型转换。有时可以用Excel,相比文本文件,Excel的单元格信息中带有数据类型,但有行列数限制,处理起来速度也较慢。

用集算器 SPL 集文件(btx),则没有上述文件的问题。btx是专用的二进制格式文件,自动记录了数据的数据类型,也没有内容大小的限制。还可根据需求在已有的集文件中继续追加数据,当文件较大时可以利用分段并行提升效率。

SPL是专门为结构化(半结构化)数据设计的编程语言,不仅可以处理专用的二进制格式文件,还有完整的文本文件和Excel文件处理能力,从文件读数的代码示例如下:

btx文件:=file("Department.btx").import@b(DEPT,MANAGER,...)

txt文件:=file("Department.txt").import@t(DEPT,MANAGER:int,...)

csv文件:=file("Department.csv").import@tc(DEPT,MANAGER:int,...)

Excel文件:=file("Department.xlsx").xlsimport@t(DEPT,MANAGER,...; "sheet1")

将数据导出至文件的代码示例如下:

btx文件:=file("Department.btx").export@b(data)

txt文件:=file("Department.txt").export@t(data)

csv文件:=file("Department.csv").export@tc(data)

Excel文件:=file("Department.xlsx").xlsexport@t(data; "sheet1")

数据量较大时,还可以对文件创建游标后,基于游标进行运算,或将游标中的数据读出后写到文件。比如,对大文件info.txt中的数据按条件:type==3 && sdate>=date("2021-01-01")进行过滤,结果导入数据库:


A

B

1

=file("info.txt").cursor@t(id:int,...,type:int,sdate:date)

/info为数据库工具导出的文本文件,创建读取文本文件数据的游,并指定字段类型

2

=A1.select(type==3 && sdate>=date("2021-01-01"))

/根据条件过滤数据,这里的条件也可以作为参数传入

3

=connect("mysql")

/连接数据库

4

=A3.update@i(A2,INFO)

/A2的数据插入到表INFO中,字段名与表相同

5

>A3.close()

/关闭数据库连接

集算器SPL也提供了JDBCJava调用,比如把上面的脚本存成info_ldr.dfx,在JAVA代码中以存储过程的方式调用脚本文件:

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

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

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

st.execute();