最近公司在为客户的即用升级开发,由2期升级为3期,说是说升级,其实也就是重新开发了,现在开发工作已经开发的差不多了,现在涉及到将2期的数据导入到3期中,现在将导数据的方法共享一下:
数据库:oracle
工具:PL/SQL
问题:数据迁移
详解:
由于2个项目的数据库不相同,所以,考虑到字段等特殊问题,整体思路是通过利用oracle的游标特点来实现,将主要表的数据都写成游标,在通过移动游标的指针来查找别的数据,并添加到指定的表中,具体实现如下:
执行以上游标后,数据可以成功导入到新的数据库中,如果大家有什么更好的思路,可以共享一下哦
数据库:oracle
工具:PL/SQL
问题:数据迁移
详解:
由于2个项目的数据库不相同,所以,考虑到字段等特殊问题,整体思路是通过利用oracle的游标特点来实现,将主要表的数据都写成游标,在通过移动游标的指针来查找别的数据,并添加到指定的表中,具体实现如下:
declare wizard_Id number; comName varchar(100); accCount number; endowCount number; socialId number; medCount number; fileCount number; accId number; Comid number; btId number; cout number; startYear number; startMonth number; entrustCount number; old aaa%rowtype; cursor comc is select * from aaa; begin open comc; loop fetch comc into old; exit when comc%notfound; select general.nextval into wizard_Id from dual ; select company_id into Comid from employee_up_down_post where employee_up_down_id = old.b; --插入到任务通知单表 insert into service_operate_wizard (service_operate_wizard_id,EMPLOYEE_UP_DOWN_ID,employee_id,company_id,insert_date,df,is_basic_inf,is_basic_hi,IS_ENDOW,IS_FILE_READY,IS_MEDICAL,IS_UNEMP) values( wizard_Id,old.b,old.a,Comid,sysdate,0,1,0,0,0,0,0); --公积金 select count(*) into accCount from employee_fee_period_item efpi where efpi.employee_fee_period_id = old.e and efpi.product_id in (10026424332,1006313,6990); if accCount >0 then select general.nextval into btId from dual ; insert into business_task (business_task_id,employee_id,company_id,employee_up_down_id,business_type,df,status,is_need_operate,wizard_id) values(btId,old.a,Comid,old.b,'11000',0,4,1,wizard_Id); update service_operate_wizard set is_basic_hi = 4,BASIC_HI_ID=btId where service_operate_wizard_id = wizard_Id; select count(*) into cout from e_business.acc_fund where employee_on_off_id = old.b; if cout >0 then --说明有公积金 select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','11000',0,'6990',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; end if; --养老等四险 select count(*) into endowCount from employee_fee_period_item efpi where efpi.employee_fee_period_id = old.e and efpi.product_id in (10026423460,7009,9033622,18766302); if endowCount >0 then --用工 select general.nextval into btId from dual ; insert into business_task (business_task_id,employee_id,company_id,employee_up_down_id,business_type,df,status,is_need_operate,wizard_id) values(btId,old.a,Comid,old.b,'10000',0,4,1,wizard_Id); update service_operate_wizard set IS_HIREFIRE = -1,HIREFIRE_ID=btId where service_operate_wizard_id = wizard_Id; select general.nextval into btId from dual ; insert into business_task (business_task_id,employee_id,company_id,employee_up_down_id,business_type,df,status,is_need_operate,wizard_id) values(btId,old.a,Comid,old.b,'10000',0,4,1,wizard_Id); update service_operate_wizard set IS_ENDOW = 4,ENDOW_ID=btId where service_operate_wizard_id = wizard_Id; --养老 select count(*)into cout from e_business.annuity_transaction where employee_on_off_id =old.b and annuity_unit_pay is not null; if cout >0 then select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','10000',0,'7009',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; --失业 select count(*)into cout from e_business.annuity_transaction where employee_on_off_id =old.b and unemployment_unit_pay is not null; if cout >0 then select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','10000',0,'7008',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; --工伤 select count(*)into cout from e_business.annuity_transaction where employee_on_off_id =old.b and occupational_unit_pay is not null; if cout >0 then select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','10000',0,'9033622',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; --生育 select count(*)into cout from e_business.annuity_transaction where employee_on_off_id =old.b and birth_unit_pay is not null; if cout >0 then select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','10000',0,'18766302',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; end if; --医疗保险 select count(*) into medCount from employee_fee_period_item efpi where efpi.employee_fee_period_id = old.e and efpi.product_id in (10026423453,10026423417,31844,31860,7010); if medCount >0 then select general.nextval into btId from dual ; insert into business_task (business_task_id,employee_id,company_id,employee_up_down_id,business_type,df,status,is_need_operate,wizard_id) values(btId,old.a,Comid,old.b,'01100',0,4,1,wizard_Id); update service_operate_wizard set IS_MEDICAL =4,MEDICAL_ID=btId where service_operate_wizard_id = wizard_Id; select count(*)into cout from e_business.annuity_transaction where employee_on_off_id =old.b and medical_unit_pay is not null; if cout >0 then select general.nextval into accId from dual; insert into EMPLOYEE_SI_SERVICE (EMPLOYEE_SI_SERVICE_ID,SERVICE_OPERATE_WIZARD_ID,BUSINESS_TASK_ID, SOCIAL_INSURANCE_ID,ACCOUNT_TYPE,OPERATE_TYPE,SOCIAL_NUMBER,ACCFUND_NUMBER,STATUS,ACCOUNT,SOCIAL_START_YEAR,SOCIAL_START_MONTH, CREATE_DATE,CREATE_MAN,MEMO,SERVICE_TYPE,DF,Product_Id,begindate,enddate,EMPLOYEE_FEE_PERIOD_ID) values (accId,wizard_Id,btId,'','','','','',4,'','','',sysdate,1030,'数据导入','1100',0,'7010',to_date(old.c,'yyyy-mm-dd'),to_date(old.d,'yyyy-mm-dd'),old.e); end if; end if; --档案 select count(*) into fileCount from employee_fee_period_item efpi where efpi.employee_fee_period_id = old.e and efpi.product_id in (7014); if fileCount >0 then select general.nextval into btId from dual ; insert into business_task (business_task_id,employee_id,company_id,employee_up_down_id,business_type,df,status,is_need_operate,wizard_id) values(btId,old.a,Comid,old.b,'01100',0,4,1,wizard_Id); update service_operate_wizard set IS_FILE_READY = 4,FILE_ID=btId where service_operate_wizard_id = wizard_Id ; end if; end loop; end;
执行以上游标后,数据可以成功导入到新的数据库中,如果大家有什么更好的思路,可以共享一下哦
相关推荐
Oracle 数据库数据迁移 Oracle 数据库数据迁移是指将 Oracle 数据库中的数据从一个系统迁移到另一个系统的过程。这其中可能涉及到多种技术和工具,例如数据备份、数据恢复、数据同步等。 在 Oracle 数据库数据迁移...
### Oracle数据库数据迁移知识点 #### 1. 概述 - **文档目的**: 本文档主要介绍了Oracle数据库数据迁移的方法和流程,适用于减灾中心的数据迁移工作。 - **系统现状**: 减灾中心的系统分为主中心(位于百子湾机房)...
将数据库1的表A迁移到数据库2的表B里面,自己配置数据库,和表的数据库信息和字段信息就可以了!很简单
一、数据库迁移——MySQL举例 1、解压 migration-4.1.4-2023-11-23.zip 2、打开 migration 工具 3、点击帮助菜单,可查看使用说明文档,如下图所示 二、迁移步骤: 1、新建组,随便起名。 2、数据库连接,新建 源库 ...
工具能够识别数据结构,转换数据类型,并将整个数据库结构和数据迁移到Oracle。此工具可能更适用于大型和复杂的数据库迁移项目,因为它能减轻手动转换的工作量。 在所有这些方案中,安全性和数据完整性都是至关重要...
数据传输服务DTS提供了快速的数据迁移功能,可以将本地数据库或者RDS实例迁移到另一个RDS实例中,支持同异构数据源之间的数据迁移,同时提供了多种ETL特性,包括结构迁移、全量数据迁移、过滤数据迁移、增量数据迁移...
8. **性能优化**:对于大规模数据迁移,可以考虑批量插入、多线程处理、分区策略等优化手段,提高迁移效率。 在项目`SynchroForDate`中,可能包含了实现这些步骤的具体Java代码。文件名暗示了可能关注的是日期相关...
在数据迁移完成后,需要重新创建在第三步中被临时删除的键、约束和索引,以恢复数据库的完整性和一致性。 七、表授权 迁移过程中必须考虑到权限和访问控制。在DM8中为新用户分配相应的对象权限,确保迁移后的功能与...
达梦数据库可视化连接工具、DM管理工具、DTS数据迁移工具等。使用该工具可以连接管理达梦数据库、调试达梦增删查改等SQL语句、存储过程,迁移mysql、oracle、dm等数据库上的数据到达梦数据库里面。
达梦数据库迁移工具是一款专为数据迁移而设计的软件,主要应用于数据库系统从其他平台向达梦数据库的平滑迁移。这款工具旨在帮助用户高效、安全地完成数据的转换、迁移和验证,确保业务系统的连续性和稳定性。在IT...
现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. 3.开发多任务的平台,按权重去执行任务,如:...
- 当迁移进度条显示为100%时,表示数据迁移已完成。 - 若迁移过程中出现任何错误提示,可通过查看“迁移报错日志”来定位问题原因,并采取相应措施进行修复。 #### 四、注意事项 - **数据校验**:迁移完成后,...
去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,有一些心得体会,与大家分享。 首先说说迁移流程,在迁移之前,写好方案,特别是实施的方案步骤一定...
Oracle数据库数据迁移是一个复杂的过程,涉及多个步骤和组件,确保数据在迁移过程中的一致性、完整性和可用性。以下是对标题和描述中所提及的知识点的详细解释: 1. **概述**: - 迁移的目标是将一个Oracle数据库...
Oracle 数据库数据迁移概览 Oracle 数据库数据迁移是一项复杂的任务,涉及到跨平台数据库传输、数据文件转换、数据库状态检查、外部对象标识等多个方面。本文将对 Oracle 数据库数据迁移的概览进行详细的介绍。 ...
### Oracle数据库迁移实例01:Windows环境下通过镜像文件实现db_name与instance_name不一致的迁移 #### 环境概述 本案例介绍了一个特定场景下的Oracle数据库迁移过程,涉及的环境包括: - **源数据库**:Oracle 9.2...
PostgreSQL 数据迁移到达梦数据库操作 PostgreSQL 数据迁移到达梦数据库操作是指将 PostgreSQL 数据库中的数据迁移到达梦数据库中的过程。该过程需要使用 Navicat for PostgreSql 工具生成 SQL 脚本,然后使用达梦...