知识大全 用Forall与bulkcollect快速复制表数据

Posted

篇首语:万事须己运,他得非我贤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Forall与bulkcollect快速复制表数据相关的知识,希望对你有一定的参考价值。

用Forall与bulkcollect快速复制表数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  本文中介绍的几种写法分别是从代码的简易性 FORALL和bulk collect的使用 以及分批插入这三方面考虑得出的 大家可以根据自己的需要灵活选择

  三种不同的写法:

   使用了BULK COLLECT 没有使用FORALL 一次性插入 分批MIT 这种方法比较适用于 万以下条数据的表;  create or replace procedure cp_data as

  type TYPE_EMPLOYEES is table of EMPLOYEES%rowtype;

  V_EMPLOYEES TYPE_EMPLOYEES;

  v_table varchar ( );

  v_sql varchar ( );

  v_rows number:= ;

  begin

  execute immediate alter session set nls_date_format= yyyy/mm/dd ;

  v_table := employee_cp ;

  v_sql := insert /*+ APPEND*/ into || v_table ||

   (EMPLOYEE_ID

  FIRST_NAME

  LAST_NAME

  EMAIL

  PHONE_NUMBER

  HIRE_DATE

  JOB_ID

  SALARY

  MISSION_PCT

  MANAGER_ID

  DEPARTMENT_ID

  BIRTHDAY)

  values (: : : : : : : : : : : : ) ;

  select * bulk collect into V_EMPLOYEES from employees; dest table

  for i in unt loop

  execute immediate v_sql

  using V_EMPLOYEES(i) EMPLOYEE_ID V_EMPLOYEES(i) FIRST_NAME V_EMPLOYEES(i) LAST_NAME V_EMPLOYEES(i) EMAIL V_EMPLOYEES(i) PHONE_NUMBER V_EMPLOYEES(i) HIRE_DATE V_EMPLOYEES(i) JOB_ID V_EMPLOYEES(i) SALARY V_EMPLOYEES(i) MISSION_PCT V_EMPLOYEES(i) MANAGER_ID V_EMPLOYEES(i) DEPARTMENT_ID V_EMPLOYEES(i) BIRTHDAY;

  if mod(i v_rows) = then

  mit;

  end if;

  end loop;

  mit;

  end;

    使用BULK COLLECT 不使用FORALL 分批插入 多次提交 比较适用于大表;   create or replace procedure cp_data as

  type t_cur is REF cursor;

  c_table t_cur;

  type t_employee is table of employees%rowtype;

  v_employees t_employee;

  rows number := ;

  v_sql varchar ( );

  v_table varchar( );

  begin

  v_table := employee_cp ;

  open c_table for

  select * from employees; sour

  v_sql := insert /*+ APPEND*/ into || v_table ||

   (EMPLOYEE_ID

  FIRST_NAME

  LAST_NAME

  EMAIL

  PHONE_NUMBER

  HIRE_DATE

  JOB_ID

  SALARY

  MISSION_PCT

  MANAGER_ID

  DEPARTMENT_ID

  BIRTHDAY) values (: : : : : : : : : : : : ) ;

  loop

  fetch c_table bulk collect

  into v_employees limit rows; 分批

  dbms_output put_line(unt);

  for i in unt loop

  execute immediate v_sql

  using V_EMPLOYEES(i) EMPLOYEE_ID V_EMPLOYEES(i) FIRST_NAME V_EMPLOYEES(i) LAST_NAME V_EMPLOYEES(i) EMAIL V_EMPLOYEES(i) PHONE_NUMBER V_EMPLOYEES(i) HIRE_DATE V_EMPLOYEES(i) JOB_ID V_EMPLOYEES(i) SALARY V_EMPLOYEES(i) MISSION_PCT V_EMPLOYEES(i) MANAGER_ID V_EMPLOYEES(i) DEPARTMENT_ID V_EMPLOYEES(i) BIRTHDAY;

  end loop;

  mit;

  exit when c_table%notfound;

  end loop;

  close c_table;

  end;

      使用BULK COLLECT和FORALL 分批插入 多次提交 比较适用于大表; 前期数据字段定义比较烦锁(表各个字段必须分开定义)

    

  create or replace procedure cp_data as

  type type_EMPLOYEE_ID is table of EMPLOYEES EMPLOYEE_ID%type;

  type type_FIRST_NAME is table of EMPLOYEES FIRST_NAME%type;

  type type_LAST_NAME is table of EMPLOYEES LAST_NAME%type;

  type type_EMAIL is table of EMPLOYEES EMAIL%type;

  type type_PHONE_NUMBER is table of EMPLOYEES PHONE_NUMBER%type;

  type type_HIRE_DATE is table of EMPLOYEES HIRE_DATE%type;

  type type_JOB_ID is table of EMPLOYEES JOB_ID%type;

  type type_SALARY is table of EMPLOYEES SALARY%type;

  type type_MISSION_PCT is table of EMPLOYEES MISSION_PCT%type;

  type type_MANAGER_ID is table of EMPLOYEES MANAGER_ID%type;

  type type_DEPARTMENT_ID is table of EMPLOYEES DEPARTMENT_ID%type;

  type type_BIRTHDAY is table of EMPLOYEES BIRTHDAY%type;

  V_EMPLOYEE_ID TYPE_EMPLOYEE_ID;

  V_FIRST_NAME TYPE_FIRST_NAME;

  V_LAST_NAME TYPE_LAST_NAME;

  V_EMAIL TYPE_EMAIL;

  V_PHONE_NUMBER TYPE_PHONE_NUMBER;

  V_HIRE_DATE TYPE_HIRE_DATE;

  V_JOB_ID TYPE_JOB_ID;

  V_SALARY TYPE_SALARY;

  V_MISSION_PCT TYPE_MISSION_PCT;

  V_MANAGER_ID TYPE_MANAGER_ID;

  V_DEPARTMENT_ID TYPE_DEPARTMENT_ID;

  V_BIRTHDAY TYPE_BIRTHDAY;

  type t_cur is ref cursor;

  c_table t_cur;

  v_table varchar ( ); dest table

  v_sql varchar ( );

  v_rows number := ;

  begin

  v_table := EMPLOYEE_CP ;

  open c_table for

  select * from employees; sour table

  v_sql := insert /*+ APPEND*/ into || v_table ||

   (EMPLOYEE_ID

  FIRST_NAME

  LAST_NAME

  EMAIL

  PHONE_NUMBER

  HIRE_DATE

  JOB_ID

  SALARY

  MISSION_PCT

  MANAGER_ID

  DEPARTMENT_ID

  BIRTHDAY)

  values (: : : : : : : : : : : : ) ;

  loop

  fetch c_table EMPLOYEE_ID c_table FIRST_NAME c_table LAST_NAME c_table EMAIL c_table PHONE_NUMBER c_table HIRE_DATE c_table JOB_ID c_table SALARY c_table MISSION_PCT c_table MANAGER_ID c_table DEPARTMENT_ID c_table BIRTHDAY

  bulk collect

  into V_EMPLOYEE_ID V_FIRST_NAME V_LAST_NAME V_EMAIL V_PHONE_NUMBER V_HIRE_DATE V_JOB_ID V_SALARY V_MISSION_PCT V_MANAGER_ID V_DEPARTMENT_ID V_BIRTHDAY limit v_rows; 分批

  forall i in unt execute immediate v_sql using

  V_EMPLOYEE_ID(i) V_FIRST_NAME(i) V_LAST_NAME(i)

  V_EMAIL(i) V_PHONE_NUMBER(i) V_HIRE_DATE(i)

  V_JOB_ID(i) V_SALARY(i) V_MISSION_PCT(i)

  V_MANAGER_ID(i) V_DEPARTMENT_ID(i) V_BIRTHDAY(i)

  ;

  mit;

  exit when c_table%notfound;

  end loop;

  end;

  

    相关附助SQL:   select type TYPE_ || column_name || is table of || table_name || ||

  column_name || %type

  from dba_tab_columns

  where table_name = EMPLOYEES

  and owner = HYF

  select V_ || column_name || TYPE_ || column_name || ;

  from dba_tab_columns

  where table_name = EMPLOYEES

  and owner = HYF

  select V_ || column_name ||

  from dba_tab_columns

  where table_name = EMPLOYEES

  and owner = HYF

  select V_ || column_name || (i)

  from dba_tab_columns

  where table_name = EMPLOYEES

  and owner = HYF

cha138/Article/program/Oracle/201311/17422

相关参考

知识大全 BULK COLLECT和FORALL优化

BULKCOLLECT和FORALL优化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Oracle中巧用bulkcollect实现cursor批量fetch

Oracle中巧用bulkcollect实现cursor批量fetch  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 复制本地数据库中的一个表到远程数据库

  首先将要复制的表导入到远程数据假设本地表名为hw在数据库也有一个名为hw的结构相同的表已经有了条数据  导入成功后会新增一个表hw  运行以下语句会复制一个表hw  select*intohwfr

知识大全 asp+access sql insert into select表复制

  这里是把一个同的数据一次性保存到另一个表用的是sqlinsertinto select另一张同结构的新表  subappend()callopendb()dimzsqlzdysqlzsq

知识大全 快速转移数据的方法

  如果你要把ORACLE里的大量数据(M以上)转移到另外的用户另外的表空间里可以用下面介绍的快速转移   数据的方法一建新表的方式  createtabletarget

知识大全 如何将EXCEL文档里所有的工作表都复制到另一个文档中

如何将EXCEL文档里所有的工作表都复制到另一个文档中  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 oracle存储过程创建表分区实例

  用存储过程创建数据表:创建时注意必须添加authidcurrent_user如果创建的表已存在存储过程继续执行但如不不加此关键语句存储过程将出现异常这个语句相当于赋权限例创建语句如下  复制代码代

知识大全 如何将同工作簿中多个工作表合并成一个

如何将同工作簿中多个工作表合并成一个把多个工作表合并到到一张表,最快捷的方法是用巨集处理:例如将多个表合并到总计表:总计表只留一个标题右键点汇总工作表标签,检视程式码,把如下程式码复制进去,F5执行:

知识大全 MSSQLSERVER中如何快速获取表的记录总数

MSSQLSERVER中如何快速获取表的记录总数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Oracle快速删除数据字典管理的表空间

Oracle快速删除数据字典管理的表空间  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我的测试