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='ORCL';
  --定义游标:获取表的所有字段
  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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值