Oracle儲存過程使用動態遊標
阿新 • • 發佈:2019-01-14
spool F:/dbtest12.log;
set timing on;
set serveroutput on;
declare
--定義遊標:獲取所有表
CURSOR c_allTables IS
select t.OWNER,t.TABLE_NAME from all_tab_comments t
where t.OWNER='GT3_SB';
--定義遊標:獲取表的所有欄位
type ref_col is ref cursor;
c_col ref_col;
--獲取表所有欄位SQL
sql_all_cols varchar (300);
v_col varchar(100);
--拼接欄位
v_cols_sql varchar(2000);
begin
--不限制 緩衝大小
DBMS_OUTPUT.ENABLE (buffer_size=>null);
--迴圈獲取表
FOR tabs IN c_allTables LOOP
sql_all_cols := 'select COLUMN_NAME from all_tab_columns where OWNER='''||tabs.OWNER||''''
||' and TABLE_NAME='''||tabs.TABLE_NAME ||''' order by column_id';
--內迴圈前,清空變數
v_cols_sql := '';
--迴圈獲取表字段
open c_col for sql_all_cols;
LOOP
fetch c_col into v_col;
exit when c_col%notfound;
IF v_cols_sql is null THEN
v_cols_sql := v_col;
ELSE
v_cols_sql := v_cols_sql||','||v_col;
END IF;
END LOOP;
close c_col;
--輸出 拼接SQL
DBMS_OUTPUT.PUT_LINE('insert into '||tabs.OWNER||'.'||tabs.TABLE_NAME||' ('||v_cols_sql||')');
DBMS_OUTPUT.PUT_LINE('select '||v_cols_sql||' from '||tabs.OWNER||'.'||tabs.TABLE_NAME||'_OLD;');
DBMS_OUTPUT.PUT_LINE('commit;');
DBMS_OUTPUT.PUT_LINE('');
END LOOP;
end;