从Excel导出数据到数据库中
在项目开发过程中,客户往往要要将其使用的 excel 存储的数据导入到其它数据库中,下面的工作主要是将 excel 导入各种数据库的汇总
准备:在数据库中创建从 excel 要导入的表结构;
一、 excel 导入 db2 的各种方法
1 :使用文本方式导入
1 )、将 access 导出具有标准格式符的文本文件,例如以逗号分隔的文本文件
2 )、在 db2 的命令行处理器中,连接上数据库,用 import 语句导入,语句如下:
import from table.txt of del modified by coldel , insert into table
同理,导出命令:
export to table.txt of del modified by coldel, select * from table
2:使用csv文件 方式导入
1)、把excel文件另存为table.csv文件
2)、在db2的命令行处理器中,连接上数据库,用import 语句导入
import from "d:/table.csv" OF DEL messages "d:/msg.out" INSERT INTO table
Monitor DB2 Load & Import
在 DB2 UDB 中,通过使用 IMPORT 和 LOAD 工具,用户可将一个符合 DB2 所支持的导入文件格式(包括 ASC,DEL,PC/IXF 和 WSF(不为 LOAD 所支持)的外部文件中的数据导入到 DB2 的数据库中。如果导出的表非常大,用户导入数据的过程会持续一段时间,此时,用户可能需要对导入过程进行监控,如查询已导入表中记录有多少行等,以便估计 完成这一过程大概还需要多长时间。本文主要介绍一下分别对 LOAD 和 IMPORT 命令执行过程进行监控的方法。
1. 对 LOAD 命令进行实时监控查询:
对于使用 LOAD 命令的用户,DB2 提供了 LOAD QUERY 的命令。在开始 LOAD 操作的过程中,用户只需在一个 DB2 命令行处理器中使用 LOAD QUERY 命令便可在输出的信息中查询到已导入表中的记录的行数。以下是一个使用的实例:
1)发出 LOAD 命令,将 INS.DEL 文件中的 110800 条记录导入到 TEST 表中:
db2 load from ins.del of del insert into test
这一导入过程完成后,会在屏幕上输出如下信息:
SQL3501W The table space(s) in which the table resides will not be placed in
backup pending state since forward recovery is disabled for the database.
SQL3109N The utility is beginning to load data from file "D: mpins.del".
SQL3500W The utility is beginning the "LOAD" phase at time "03/18/2003
11:32:02.410655". <== LOAD 操作开始的时间点
SQL3519W Begin Load Consistency Point. Input record count = "0".
SQL3520W Load Consistency Point was successful.
SQL3110N The utility has completed processing. "110800" rows were read from
the input file.
SQL3519W Begin Load Consistency Point. Input record count = "110800".
SQL3520W Load Consistency Point was successful.
SQL3515W The utility has finished the "LOAD" phase at time "03/18/2003
11:32:05.165435". <== LOAD 操作结束的时间点
Number of rows read = 110800
Number of rows skipped = 0
Number of rows loaded = 110800 <== LOAD 操作正常结束后共导入的记录总数
Number of rows rejected = 0
Number of rows deleted = 0
Number of rows committed = 110800 <== 提交的导入记录总数
2)在 LOAD 进行的过程中(时间介于 11:32:02.410655 至 11:32:05.165435 之间),于一个 DB2 CLP 下启动关于 LOAD 查询的命令,并将输出信息定向到文件 LdOutput 中:
db2 load query table test to LdOutput
3)待 LOAD QUERY 命令执行结束后,打开命令所产生的输出文件 LdOutput,其中内容如下:
SQL3501W The table space(s) in which the table resides will not be placed in
backup pending state since forward recovery is disabled for the database.
SQL3109N The utility is beginning to load data from file "D: mpins.del".
SQL3500W The utility is beginning the "LOAD" phase at time "03/18/2003
11:32:02.410656". <== LOAD 查询操作开始的时间点
SQL3519W Begin Load Consistency Point. Input record count = "0".
SQL3520W Load Consistency Point was successful.
SQL3532I The Load utility is currently in the "LOAD" phase.
Number of rows read = 8192
Number of rows skipped = 0
Number of rows loaded = 8192 <== 在 LOAD QUERY 命令发出的时间点上已导入 TEST 表中的记录的行数
Number of rows rejected = 0
Number of rows deleted = 0
Number of rows committed = 0
Number of warnings = 0
2. 对 IMPORT 命令进行实时监控查询:
与 LOAD 命令不同,IMPORT 没有类似 LOAD QUERY 的命令用来对其导入过程进行查询,为实现这一功能,用户可使用以下两种方式:
- 在 IMPORT 语句中加入 COMMITCOUNT 参数:
在 IMPORT 语句中 COMMITCOUNT 参数的作用是强制 IMPORT 过程在导入 COMMITCOUNT 所指定的记录行数后便进行一次提交,将数据写入表中。例如要使 IMPORT 命令在执行过程中每导入 10000 条记录就提交一次,可使用以下命令:
db2 import from ins.del of del commitcount 10000 insert into test
此时用户通过命令在执行过程中输出到屏幕上信息,便可监测到目前导入表中的记录数:
SQL3109N The utility is beginning to load data from file "ins.del".
SQL3221W ...Begin COMMIT WORK. Input Record Count = "10000". <== 已导入 10000 条记录
SQL3222W ...COMMIT of any database changes was successful.
SQL3221W ...Begin COMMIT WORK. Input Record Count = "20000". <== 已导入 20000 条记录
:
SQL3222W ...COMMIT of any database changes was successful. :
SQL3221W ...Begin COMMIT WORK. Input Record Count = "30000".
SQL3222W ...COMMIT of any database changes was successful.
使用快照监控程序(SNAPSHOT):
如果由于应用程序的限制或其它原因,用户不希望使用在 IMPORT 语句中加入 COMMITCOUNT 参数的方式,那么 DB2 还为用户提供了功能完备的各种系统监控程序,通过巧妙地使用其中的快照监控程序,用户同样可以捕捉到快照时间点上已导入表中的记录数,从而获取某个时间点 上 IMPORT 语句执行情况的信息。
1)打开快照监控程序的 SQL 语句监控开关:
在一个 DB2 CLP 下打开快照监控程序的某个监控开关的方式有两种:
a. 修改相应的数据库管理器参数:
db2 update dbm cfg using dft_mon_stmt on (对当前实例下的所有用户生效)
db2 terminate
b. 打开应用程序级别的相应监控开关:
db2 update monitor swithches using statement on
(对发出以上命令的应用程序生效,即在该 DB2 CLP 中生效)
2)发出 IMPORT 命令,将 INS.DEL 文件中的 110800 条记录导入到 TEST 表中:
db2 import from ins.del of del insert into test
这一导入过程完成后,会在屏幕上输出如下信息:
SQL3109N The utility is beginning to load data from file "ins.del".
SQL3110N The utility has completed processing. "110800" rows were read from
the input file.
SQL3221W ...Begin COMMIT WORK. Input Record Count = "110800".
SQL3222W ...COMMIT of any database changes was successful.
SQL3149N "110800" rows were processed from the input file. "110800" rows
were successfully inserted into the table. "0" rows were rejected.
Number of rows read = 110800
Number of rows skipped = 0
Number of rows inserted = 110800 <== IMPORT 操作正常结束后共导入的记录总数
Number of rows updated = 0
Number of rows rejected = 0
Number of rows committed = 110800 <== 提交的导入记录总数
注:与 LOAD 命令的输出不同,IMPORT 命令的输出没有时间戳的信息。
3)启动快照监控程序,对 SQL 语句的执行情况捕捉快照。
db2 get snapshot for dynamic sql on sample > MonOutput <== 将输出定向到 MonOutput 文件中
命令完成后打开 MonOutput 定向输出文件,可以找到如下信息:
Dynamic SQL Snapshot Result
Database name = SAMPLE
Database path = DB2NODE0000SQL00001
Number of executions = 1
Number of compilations = 1
Worst preparation time (ms) = 1
Best preparation time (ms) = 1
Internal rows deleted = 0
Internal rows inserted = 0
Rows read = 0
Internal rows updated = 0
Rows written = 20353 <== 在快照发生的时间点上已插入表中的记录数
Statement sorts = 0
Total execution time (sec.ms) = 1.735299
Total user cpu time (sec.ms) = 1.031482
Total system cpu time (sec.ms) = 0.020028
Statement text = INSERT INTO test ("A1" VALUES (CAST (? AS DEC(4,1))
以对表进行插入的 SQL 语句作为标记,在具有该 Statement的输出段中查找如上 Rows written 的信息
以上是如何对 DB2 的两种数据导入工具:LOAD 和 IMPORT 的执行过程实现监控的介绍,其中对 IMPORT 使用了 DB2 提供的监控程序,实际上 DB2 监控程序所能监控的信息远不止于此,感兴趣的用户可以对它们的使用进行更进一步的研究,这对于帮助用户分析和解决问题,提高数据库的性能都是非常有好处 的。