当进行大量数据迁移时,如果只考虑使用数据库的话可以用到load实例,load实例可以快速读取大量数据并插入到目标表中,但是使用也有优缺点
优点:由于load实例是用直接将编译好的页数据放到目标表中,效率非常高。如果可以确保数据的完整性建议使用load实例。
缺点:load实例只会检测到唯一索引约束,其他的不能检测到,可能会破坏数据的完整性。
方式一:
CREATE OR REPLACE PROCEDURE "DB2ADMIN"."MPF_TEST01"
()
LANGUAGE SQL
SPECIFIC SQL191021093246600
BEGIN CALL SYSPROC.ADMIN_CMD('LOAD FROM (select * from mpf_test1) OF CURSOR INSERT INTO mpf_test2 ');
END
说明:mpf_test1 是源表 mpf_test2是目标表 这句话的意思将源表的全部数据load到目标中。
方式二:
declare sql_1 varchar(10000) default '';
declare sql_2 varchar(1000) default '';
declare flagt varchar(1000) default '';
DECLARE v_version_number1 INTEGER DEFAULT 1;
DECLARE v_cursor_statement1 VARCHAR(32672);
DECLARE v_load_command1 VARCHAR(32672);
DECLARE v_sqlcode1 INTEGER DEFAULT 1;
DECLARE V_SQLMESSAGE1 VARCHAR(2048) DEFAULT '';
DECLARE v_rows_read1 BIGINT DEFAULT 1;
DECLARE v_rows_skipped1 BIGINT DEFAULT 1;
DECLARE v_rows_loaded1 BIGINT DEFAULT 1;
DECLARE v_rows_rejected1 BIGINT DEFAULT 1;
DECLARE v_rows_deleted1 BIGINT DEFAULT 1;
DECLARE v_rows_committed1 BIGINT DEFAULT 1;
DECLARE v_rows_part_read1 BIGINT DEFAULT 1;
DECLARE v_rows_part_rejected1 BIGINT DEFAULT 1;
DECLARE v_rows_part_partitioned1 BIGINT DEFAULT 1;
DECLARE v_mpp_load_summary1 VARCHAR(32672) DEFAULT NULL;
-- 删除local_test表中数据
set flagt = 'alter table local_test activate not logged initially with empty table';
execute immediate flagt;
-- 查询 test 表中符合条件的字段
set sql_1 = ' declare aa cursor for select a.AGNTPFX, a.AGNTCOY, a.AGNTNUM, a.TRANID, a.VALIDFLAG, a.CLNTPFX, a.CLNTCOY, a.CLNTNUM, a.AGNTREL, a.AGTYPE, a.AGNTBR, a.REPLVL, a.REPAGENT01, a.REPAGENT02, a.REPAGENT03, a.REPAGENT04, a.REPAGENT05, a.REPAGENT06, a.REPORTAG01, a.REPORTAG02, a.REPORTAG03 from test a WHERE a.agtype != ''RC'' with ur ';
set sql_2 = ' load from aa of cursor insert into local_test nonrecoverable ';
– 调用存储插入数据
CALL sysproc.db2load (v_version_number1,sql_1,sql_2,v_sqlcode1,v_sqlmessage1,v_rows_read1,v_rows_skipped1,v_rows_loaded1,v_rows_rejected1,v_rows_deleted1,v_rows_committed1,v_rows_part_read1,v_rows_part_rejected1,v_rows_part_partitioned1,v_mpp_load_summary1);
注意: 如果表中有字段为DB2关键字(比如user、password等),需要在查询的时候加上英文状态下的双引号(select “user”, “password” from t1),否则无效。是字符串时需要加四个英文状态下的单引号, 例如:a.agtype != ‘‘RC’’, 否则无效。查询sql写错无效,第二种方式不可以使用select *查询,只能将所查字段单个查询,第一种方式可以使用select * 查询。
方式二中的test和local_test是同构表