全表複製過程建立指令碼
能自動建立過程指令碼,能讓你直接輸入源泉表名和目標表名就能建立以下連結中的全表複製過程.(第三部分) http://steven1981.itpub.net/post/7967/413828
[@more@]--表複製過程NEW
create or replace procedure hyf_create_sql(p_sour_tab in varchar2,
p_dst_tab in varchar2) as
/*
-- 此存過能產生:一個用來從源表複製到目標表的存過;
-- 要求在目標庫上佈置這個程式碼 ;(即 p_dst_tab必須為本地表)
-- 使用:
p_dst_tab in varchar2) as
/*
-- 此存過能產生:一個用來從源表複製到目標表的存過;
-- 要求在目標庫上佈置這個程式碼 ;(即 p_dst_tab必須為本地表)
-- 使用:
exec hyf_create_sql('sour_table_name[@dblink_name]','dst_table_name');
Last_modifier:Steven
Last_modified:2008-08-21
*/
v_sour_domain varchar2(100);
v_dst_domain varchar2(100);
v_sour_tab varchar2(30);
v_dst_tab varchar2(30);
v_proc_name varchar2(30);
v_proc_code varchar2(32767);
v_buffer varchar2(100);
type t_cur is ref cursor;
v_cur t_cur;
v_col_num number;
v_tab_count number;
v_sum number;
E_no_table exception;
E_diff exception;
v_dst_domain varchar2(100);
v_sour_tab varchar2(30);
v_dst_tab varchar2(30);
v_proc_name varchar2(30);
v_proc_code varchar2(32767);
v_buffer varchar2(100);
type t_cur is ref cursor;
v_cur t_cur;
v_col_num number;
v_tab_count number;
v_sum number;
E_no_table exception;
E_diff exception;
begin
--判斷是否為遠端表
if instr(p_sour_tab, ) = 0 then
v_sour_domain := '';
v_sour_tab := upper(p_sour_tab);
else
v_sour_domain := substr(p_sour_tab, instr(p_sour_tab, ));
v_sour_tab := upper(substr(p_sour_tab, 1, instr(p_sour_tab, ) - 1));
end if;
--判斷是否為遠端表
if instr(p_sour_tab, ) = 0 then
v_sour_domain := '';
v_sour_tab := upper(p_sour_tab);
else
v_sour_domain := substr(p_sour_tab, instr(p_sour_tab, ));
v_sour_tab := upper(substr(p_sour_tab, 1, instr(p_sour_tab, ) - 1));
end if;
if instr(p_dst_tab, ) = 0 then
v_dst_domain := '';
v_dst_tab := upper(p_dst_tab);
else
v_dst_domain := substr(p_dst_tab, instr(p_dst_tab, ));
v_dst_tab := upper(substr(p_dst_tab, 1, instr(p_dst_tab, ) - 1));
end if;
v_dst_domain := '';
v_dst_tab := upper(p_dst_tab);
else
v_dst_domain := substr(p_dst_tab, instr(p_dst_tab, ));
v_dst_tab := upper(substr(p_dst_tab, 1, instr(p_dst_tab, ) - 1));
end if;
--判斷源表和目標表是不是都存在
execute immediate 'select count(*) from user_tables' || v_sour_domain ||
' where table_name=''' || v_sour_tab || ''''
into v_tab_count;
if v_tab_count = 0 then
raise e_no_table;
end if;
execute immediate 'select count(*) from user_tables' || v_sour_domain ||
' where table_name=''' || v_sour_tab || ''''
into v_tab_count;
if v_tab_count = 0 then
raise e_no_table;
end if;
select count(*)
into v_tab_count
from user_tables
where table_name = upper(p_dst_tab);
if v_tab_count = 0 then
raise e_no_table;
end if;
into v_tab_count
from user_tables
where table_name = upper(p_dst_tab);
if v_tab_count = 0 then
raise e_no_table;
end if;
--判斷源表和目標表的欄位是不是一致
execute immediate ' select count(*) from (select column_name, data_type, data_length from user_tab_columns' ||
v_sour_domain || ' where table_name = ''' || v_sour_tab ||
''' intersect select column_name, data_type, data_length from user_tab_columns' ||
v_dst_domain || ' where table_name = ''' || v_dst_tab ||
''')'
into v_tab_count;
execute immediate ' select count(*) from (select column_name, data_type, data_length from user_tab_columns' ||
v_sour_domain || ' where table_name = ''' || v_sour_tab ||
''' intersect select column_name, data_type, data_length from user_tab_columns' ||
v_dst_domain || ' where table_name = ''' || v_dst_tab ||
''')'
into v_tab_count;
execute immediate 'select count(*) from user_tab_columns' ||
v_sour_domain || ' where table_name = ''' || v_sour_tab || ''''
into v_col_num;
if v_col_num <> v_tab_count then
raise e_diff;
end if;
v_sour_domain || ' where table_name = ''' || v_sour_tab || ''''
into v_col_num;
if v_col_num <> v_tab_count then
raise e_diff;
end if;
--檢查過程名是不是有衝突
v_proc_name := 'cp_' || substr(v_sour_tab, 1, 13) || '2' ||
substr(p_dst_tab, 1, 13);
loop
select count(*)
into v_tab_count
from user_objects
where object_type = 'PROCEDURE'
and object_name = upper(v_proc_name);
exit when v_tab_count = 0;
v_sum := v_sum + 1;
v_proc_name := substr(v_proc_name, 1, 29) || v_sum;
end loop;
dbms_output.put_line(v_proc_name);
--開始組織存過程式碼
v_proc_name := 'cp_' || substr(v_sour_tab, 1, 13) || '2' ||
substr(p_dst_tab, 1, 13);
loop
select count(*)
into v_tab_count
from user_objects
where object_type = 'PROCEDURE'
and object_name = upper(v_proc_name);
exit when v_tab_count = 0;
v_sum := v_sum + 1;
v_proc_name := substr(v_proc_name, 1, 29) || v_sum;
end loop;
dbms_output.put_line(v_proc_name);
--開始組織存過程式碼
v_proc_code := 'create or replace procedure ' || v_proc_name || ' as ';
for x in (select 'type TYPE_' || column_name || ' is table of ' ||
table_name || '.' || column_name || '%type;' as dd
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc) loop
v_proc_code := v_proc_code || x.dd;
end loop;
table_name || '.' || column_name || '%type;' as dd
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc) loop
v_proc_code := v_proc_code || x.dd;
end loop;
for x in (select 'V_' || column_name || ' TYPE_' || column_name || ';' as dd
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc) loop
v_proc_code := v_proc_code || x.dd;
end loop;
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc) loop
v_proc_code := v_proc_code || x.dd;
end loop;
v_proc_code := v_proc_code || 'type t_cur is ref cursor;';
v_proc_code := v_proc_code || 'c_table t_cur;';
v_proc_code := v_proc_code || 'v_sql varchar2(500);';
v_proc_code := v_proc_code || 'v_rows number := 10000;';
v_proc_code := v_proc_code || 'begin ';
v_proc_code := v_proc_code || 'execute immediate ''truncate table ' ||
p_dst_tab || ''';';
v_proc_code := v_proc_code || 'open c_table for';
dbms_output.put_line(p_sour_tab);
v_proc_code := v_proc_code || ' select * from ' || p_sour_tab || ';';
v_proc_code := v_proc_code || 'v_sql := ''insert /*+ APPEND*/ into ' ||
p_dst_tab || ' (';
v_proc_code := v_proc_code || 'c_table t_cur;';
v_proc_code := v_proc_code || 'v_sql varchar2(500);';
v_proc_code := v_proc_code || 'v_rows number := 10000;';
v_proc_code := v_proc_code || 'begin ';
v_proc_code := v_proc_code || 'execute immediate ''truncate table ' ||
p_dst_tab || ''';';
v_proc_code := v_proc_code || 'open c_table for';
dbms_output.put_line(p_sour_tab);
v_proc_code := v_proc_code || ' select * from ' || p_sour_tab || ';';
v_proc_code := v_proc_code || 'v_sql := ''insert /*+ APPEND*/ into ' ||
p_dst_tab || ' (';
open v_cur for
select column_name
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
select column_name
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
for i in 1 .. v_col_num loop
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_proc_code := v_proc_code || v_buffer || ',';
else
v_proc_code := v_proc_code || v_buffer || ')';
end if;
end loop;
close v_cur;
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_proc_code := v_proc_code || v_buffer || ',';
else
v_proc_code := v_proc_code || v_buffer || ')';
end if;
end loop;
close v_cur;
v_proc_code := v_proc_code || ' values (';
for i in 1 .. v_col_num loop
if i <> v_col_num then
v_proc_code := v_proc_code || ':' || i || ',';
else
v_proc_code := v_proc_code || ':' || i || ')'';';
end if;
end loop;
for i in 1 .. v_col_num loop
if i <> v_col_num then
v_proc_code := v_proc_code || ':' || i || ',';
else
v_proc_code := v_proc_code || ':' || i || ')'';';
end if;
end loop;
v_proc_code := v_proc_code || 'loop ';
v_proc_code := v_proc_code || ' fetch c_table ';
v_proc_code := v_proc_code || ' bulk collect into ';
v_proc_code := v_proc_code || ' fetch c_table ';
v_proc_code := v_proc_code || ' bulk collect into ';
open v_cur for
select 'v_' || column_name
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
for i in 1 .. v_col_num loop
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_buffer := v_buffer || ',';
end if;
v_proc_code := v_proc_code || v_buffer;
end loop;
close v_cur;
select 'v_' || column_name
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
for i in 1 .. v_col_num loop
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_buffer := v_buffer || ',';
end if;
v_proc_code := v_proc_code || v_buffer;
end loop;
close v_cur;
v_proc_code := v_proc_code || ' limit v_rows;';
v_proc_code := v_proc_code || 'forall i in 1 .. ' || v_buffer ||
'.count execute immediate v_sql using ';
'.count execute immediate v_sql using ';
open v_cur for
select 'v_' || column_name || '(i)'
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
select 'v_' || column_name || '(i)'
from user_tab_columns
where table_name = v_dst_tab
order by column_id asc;
for i in 1 .. v_col_num loop
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_buffer := v_buffer || ',';
else
v_buffer := v_buffer || ';';
end if;
v_proc_code := v_proc_code || v_buffer;
end loop;
close v_cur;
v_proc_code := v_proc_code || ' commit;';
v_proc_code := v_proc_code || ' exit when c_table%notfound;';
v_proc_code := v_proc_code || 'end loop;';
v_proc_code := v_proc_code || ' close c_table;';
v_proc_code := v_proc_code || 'end;';
fetch v_cur
into v_buffer;
if i <> v_col_num then
v_buffer := v_buffer || ',';
else
v_buffer := v_buffer || ';';
end if;
v_proc_code := v_proc_code || v_buffer;
end loop;
close v_cur;
v_proc_code := v_proc_code || ' commit;';
v_proc_code := v_proc_code || ' exit when c_table%notfound;';
v_proc_code := v_proc_code || 'end loop;';
v_proc_code := v_proc_code || ' close c_table;';
v_proc_code := v_proc_code || 'end;';
--產生過程
execute immediate v_proc_code;
execute immediate v_proc_code;
exception
when e_no_table then
dbms_output.put_line('ERROR -- Can not found the SOURCE table or DEST table!');
when e_diff then
dbms_output.put_line('ERROR -- There is some DIFF between SOURCE table and DEST table ! ');
end;
when e_no_table then
dbms_output.put_line('ERROR -- Can not found the SOURCE table or DEST table!');
when e_diff then
dbms_output.put_line('ERROR -- There is some DIFF between SOURCE table and DEST table ! ');
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-994277/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- redis建立主從複製的過程Redis
- 複製建立已有資料庫使用者、表空間、許可權的指令碼資料庫指令碼
- MySQL 複製全解析 Part 11 使用xtrabackup建立MySQL複製MySql
- Redis複製過程詳解Redis
- MySQL Xtrabackup真實生產環境搭建主從複製全過程MySql
- python指令碼批次建立資料表Python指令碼
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- MySQL GTID複製中斷修復過程MySql
- Netty NioEventLoop 建立過程原始碼分析NettyOOP原始碼
- Vue initAssetRegisters()建立元件、指令、過濾器原始碼Vue元件過濾器原始碼
- Python Matplotlib繪製條形圖的全過程Python
- MySQL 主從複製過濾新增庫表過濾方案MySql
- 使用AnalyticDB MySQL建立資料庫及表過程MySql資料庫
- SQL Server 2005的複製儲存過程選項BYSQLServer儲存過程
- Linux下MySQL主從複製(Binlog)的部署過程LinuxMySql
- SQLServer 2012複製訂閱資料訂閱過程SQLServer
- Oracle 建立表空間和使用者指令碼Oracle指令碼
- Laravel 通過遷移指令碼建立MySQL檢視Laravel指令碼MySql
- Laravel 透過遷移指令碼建立MySQL檢視Laravel指令碼MySql
- openGauss核心分析(九):資料庫表的建立過程資料庫
- SAP Query建立過程
- [JVM]物件建立過程JVM物件
- 指令的執行過程
- 建立分庫分表(在主從複製的基本上)
- 複製表的方法
- MySQL組複製(MGR)全解析 Part 1 組複製背景MySql
- 線上定時指令碼執行慢,分析過程指令碼
- sqlserver資料庫還原儲存過程指令碼SQLServer資料庫儲存過程指令碼
- Spring 原始碼(12)Spring Bean 的建立過程(3)Spring原始碼Bean
- Spring 原始碼(11)Spring Bean 的建立過程(2)Spring原始碼Bean
- Spring 原始碼(13)Spring Bean 的建立過程(4)Spring原始碼Bean
- Spring 原始碼(10)Spring Bean 的建立過程(1)Spring原始碼Bean
- Spring 原始碼(14)Spring Bean 的建立過程(5)Spring原始碼Bean
- 遞迴處理複製變數目錄按原路徑複製到新目錄的指令碼遞迴變數指令碼
- [ Shell ] 通過 Shell 指令碼匯出 CDL 網表指令碼
- 透過原始碼分析RocketMQ主從複製原理原始碼MQ
- MySQL主從複製歷程MySql
- 複製程式碼
- Jmeter —— 錄製指令碼JMeter指令碼