1. 程式人生 > >Oracle儲存過程使用動態遊標

Oracle儲存過程使用動態遊標

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;