全表複製過程建立指令碼
能自動建立過程指令碼,能讓你直接輸入源泉表名和目標表名就能建立以下連結中的全表複製過程.(第三部分) 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
- MySQL主主複製(雙主複製)配置過程介紹MySql
- 建立一個standby database的全過程Database
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- 批次過程獲取指令碼指令碼
- 指令碼建立表空間、使用者、表指令碼
- mysql一些複製表、增刪改索引、建儲存過程、建立函式、建立觸發器的一些命令MySql索引儲存過程函式觸發器
- Duplicate 複製資料庫實驗過程資料庫
- GoldenGate schema級複製 實施過程Go
- 用儲存過程動態建立表儲存過程
- 通過shell定製ash指令碼指令碼
- 透過shell定製ash指令碼指令碼
- 單個過程獲取指令碼指令碼
- 將表資料生成SQL指令碼的儲存過程和工具SQL指令碼儲存過程
- python指令碼批次建立資料表Python指令碼
- MySQL GTID複製中斷修復過程MySql
- 生成sql server2000物件建立指令碼的儲存過程(轉)SQLServer物件指令碼儲存過程
- 儲存過程批量生成awr指令碼儲存過程指令碼
- MySQL表複製MySql
- MySQL主從複製_複製過濾MySql
- MySQL主從複製的詳細過程介紹MySql
- 通用自動為某表某欄位生成複製名稱的儲存過程儲存過程
- 透過oracle的指令碼研究其建庫過程Oracle指令碼
- 通過oracle的指令碼研究其建庫過程Oracle指令碼
- Netty NioEventLoop 建立過程原始碼分析NettyOOP原始碼
- Vue initAssetRegisters()建立元件、指令、過濾器原始碼Vue元件過濾器原始碼
- 詳解Oracle建立使用者許可權全過程Oracle
- MySQL組複製(MGR)全解析 Part 1 組複製背景MySql
- oracle 複製中設定主體站點指令碼Oracle指令碼
- Python Matplotlib繪製條形圖的全過程Python
- mysql:sql as 複製表MySql
- mysql ab主從複製出錯及解決過程MySql
- RMAN遠端複製搭建物理DG過程小結
- goldengate 過濾對某張表的複製操作Go