如何使用存储过程将表数据迁移至另一表并支持条件过滤
实现前置准备
迁移前先创建和源表结构一致的目标表Department_SP,避免字段不匹配报错:
create table Department_SP( deptno number, deptname varchar2(50), deptloc varchar2(50) );
存储过程实现示例
示例1:固定过滤规则的迁移存储过程
直接在插入的SELECT语句后加WHERE子句自定义过滤条件即可,适合规则固定的迁移场景:
CREATE OR REPLACE PROCEDURE migrate_dept_data IS BEGIN INSERT INTO Department_SP(deptno, deptname, deptloc) SELECT deptno, deptname, deptloc FROM department -- 下方自定义过滤规则,示例为仅迁移部门编号大于1、所在地不是X的记录 WHERE deptno > 1 AND deptloc != 'X'; COMMIT; DBMS_OUTPUT.PUT_LINE('迁移完成,共迁移'||SQL%ROWCOUNT||'条记录'); EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('迁移出错,错误信息:'||SQLERRM); END migrate_dept_data; /
调用方式:
-- 执行存储过程 EXEC migrate_dept_data; -- 验证迁移结果 SELECT * FROM Department_SP;
示例2:支持动态传入过滤条件的存储过程
如果需要灵活调整迁移规则,可以把过滤条件作为入参传入,适配不同场景的迁移需求:
CREATE OR REPLACE PROCEDURE migrate_dept_data_dynamic( p_filter_condition VARCHAR2 DEFAULT NULL -- 不传参默认全量迁移 ) IS v_sql VARCHAR2(2000); BEGIN v_sql := 'INSERT INTO Department_SP(deptno, deptname, deptloc) SELECT deptno, deptname, deptloc FROM department'; -- 拼接过滤条件 IF p_filter_condition IS NOT NULL THEN v_sql := v_sql || ' WHERE ' || p_filter_condition; END IF; EXECUTE IMMEDIATE v_sql; COMMIT; DBMS_OUTPUT.PUT_LINE('迁移完成,共迁移'||SQL%ROWCOUNT||'条记录'); EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('迁移出错,错误信息:'||SQLERRM); END migrate_dept_data_dynamic; /
调用示例:
- 全量迁移:
EXEC migrate_dept_data_dynamic; - 仅迁移部门名称为B的记录:
EXEC migrate_dept_data_dynamic('deptname = ''B'''); - 迁移部门编号在1-2之间的记录:
EXEC migrate_dept_data_dynamic('deptno BETWEEN 1 AND 2');
注意事项
- 迁移前建议先备份目标表原有数据,避免误操作导致数据丢失
- 数据量较大的场景可以增加批量提交逻辑,减少事务资源占用
- 生产环境使用动态SQL时要对传入的过滤条件做合法性校验,规避SQL注入风险
内容的提问来源于stack exchange,提问作者AlbertAlex
相关产品推荐
相关产品推荐

