程序里要在数据库之间搬动数据用什么文件中介?
数据库之间搬动数据,需要先将源数据导出到中介文件后,或对文件中的数据进行修改,再导入到目标数据库。使用文本文件(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也提供了JDBC供Java调用,比如把上面的脚本存成info_ldr.dfx,在JAVA代码中以存储过程的方式调用脚本文件:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
st = con.prepareCall("call info_ldr()");
st.execute();
…
英文已更新