- 使用pls|sql对oracel的基本sql进行了扩展
使用plsql对含有大字段的数据进行迁移 ,
前提:(1) 数据量很大; (2)存在blog或者clob字段里面存放的数据值很大; (3)两个表的字段不对应
根据每天的数据量来实现数据迁移
DECLARE
v_num NUMBER := 0 ; i NUMBER := 0 ;
BEGIN
-- 循环
loop
-- IF i == 0 THEN
-- -- 手动开启事务 tran
-- SET TRANSACTION NAME 'tran' ;
-- END
-- IF ;
-- 开启事务
SET TRANSACTION NAME 'tran' ;
INSERT INTO "F_COMPARE_PHOTO" (
"GUID",
"HISTORY_GUID",
"PHOTO_ID",
"PHOTO_USER",
"PHOTO_CHIP",
"CREATE_TIME",
"ID_PHOTO" ,
"USER_PHOTO"
) (
SELECT
"GUID",
"HISTORY_GUID",
NULL AS "PHOTO_ID",
NULL AS "PHOTO_USER",
NULL AS "PHOTO_CHIP",
"CREATE_TIME",
"PHOTO_ID" AS "ID_PHOTO" ,
NULL AS "USER_PHOTO"
FROM
T_COMPARE_HISTORY_PHOTO
-- 条件中是绑定一天的数据,搬迁完一天的数据,时间会加一天
WHERE
CREATE_TIME BETWEEN (
TO_DATE (
'2016-11-10 00:00:01',
'yyyy-mm-dd hh24:mi:ss'
) + v_num
)
AND (
TO_DATE (
'2016-11-10 00:00:00',
'yyyy-mm-dd hh24:mi:ss'
) + 1 + v_num
)
) ;
v_num := v_num + 1 ;
i := i + 1 ;
-- IF i == 100 THEN
-- -- 手动开启事务 tran
-- i := 0 ; COMMIT ;
-- END
-- IF ;
-- 提交事务
COMMIT ;
exit
-- 当最终日期,到达设定的日期,就停止搬迁,因为我的老数据还在新增,所以为了后续搬迁,设置了时间节点
WHEN (
TO_DATE (
'2016-11-10 00:00:00',
'yyyy-mm-dd hh24:mi:ss'
) + v_num
) > "TO_DATE" (
'2018-09-16 00:00:00',
'yyyy-mm-dd hh24:mi:ss'
) ;
END loop ;
-- 这个提交事务,可以不写,是留给批量提交用的,就是注释的那部分
COMMIT ;
END ;
- 用到的条件语句decode
-- 最终表 成功 --> 0 失败--> 2 未验证 -->-1(这里还是,保留原来的值,不改成-1了)
-- 目前表 成功 --> null 失败--> null 未验证 (自己本身存在值)
-- 0--> 2 1 --> 0 -1 --> -1
DECODE (t1."SUCCESS", '0', '2','1', '0', -1) AS RETURN_CODE,
- 查询重复值并删除保留一个
SELECT *
FROM TABLE_NAME A
WHERE ROWID NOT IN (SELECT MAX(ROWID)
FROM TABLE_NAME D
WHERE A.COL1 = D.COL1
AND A.COL2 = D.COL2);
DELETE FROM TABLE_NAME
WHERE ROWID NOT IN (SELECT MAX(ROWID)
FROM TABLE_NAME D
group by d.col1,d.col2);