知识大全 用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
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 astype 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
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
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相关参考
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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
用存储过程创建数据表:创建时注意必须添加authidcurrent_user如果创建的表已存在存储过程继续执行但如不不加此关键语句存储过程将出现异常这个语句相当于赋权限例创建语句如下 复制代码代
如何将同工作簿中多个工作表合并成一个把多个工作表合并到到一张表,最快捷的方法是用巨集处理:例如将多个表合并到总计表:总计表只留一个标题右键点汇总工作表标签,检视程式码,把如下程式码复制进去,F5执行:
MSSQLSERVER中如何快速获取表的记录总数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Oracle快速删除数据字典管理的表空间 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我的测试