oracle+bulk+java,带有动态查询和表名的BULK COLLECT / FORALL语句 - Oracle PL / SQL

我需要帮助优化此查询以使用批量收集和forall语句 . 我创建了备份表(BCK_xxxx)来复制原始表(ORIG_xxx)中的所有数据,但我在将其转换为批量收集时遇到问题 . 我在BULK collect中看到的大多数示例包括已使用%rowtype定义表名和结构 . 但是,我有数百个表要备份,所以我需要我的查询,特别是表名是动态的 . 这是我的原始查询,逐个插入/删除数据而不进行批量收集并花费大量时间:

DECLARE

--select all table names from backup tables (ex: BCK_tablename)

CURSOR cur_temp_tbl IS

SELECT table_name

FROM all_tables

WHERE OWNER = 'BCKUP'

ORDER BY 1;

--select all table names from original tables (ex: ORIG_tablename)

CURSOR cur_original_tbl IS

SELECT table_name

FROM all_tables

WHERE OWNER = 'ORIG'

ORDER BY 1;

l_tbl_nm VARCHAR2(30 CHAR);

BEGIN

--first loop to delete all tables from backup

FOR a IN cur_temp_tbl LOOP

l_tbl_nm := a.table_name;

EXECUTE IMMEDIATE 'DELETE FROM '|| l_tbl_nm;

l_deleted_cnt := l_deleted_cnt +1;

END LOOP;

--second loop to insert data from original to backup

FOR b IN cur_original_tbl LOOP

l_tbl_nm := b.table_name;

CASE

WHEN INSTR(l_tbl_nm,'ORIG_') > 0 THEN

l_tbl_nm := REPLACE(l_tbl_nm,'ORIG_','BCK_');

ELSE

l_tbl_nm := 'BCK_' || l_tbl_nm;

END CASE;

EXECUTE IMMEDIATE 'INSERT INTO ' || l_tbl_nm || ' SELECT * FROM ' || b.table_name;

l_inserted_cnt := l_inserted_cnt +1;

END LOOP;

dbms_output.put_line('Deleted/truncated tables from backup :' ||l_deleted_cnt);

dbms_output.put_line('No of tables inserted with data from original to backup :' ||l_inserted_cnt);

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line(SQLERRM);

dbms_output.put_line(l_tbl_nm);

END;

我想在下面的代码中包含以下代码在我的第二个循环之后添加,但是我遇到了如何声明'cur_tbl'游标和'l_tbl_data'TABLE数据类型的问题 . 我无法使用rowtype,因为tablename应该是动态的,并且会在我的第二个循环的每次迭代中更改,它将列出原始表中的所有表名:

TYPE CurTblTyp IS REF CURSOR;

cur_tbl CurTblTyp;

TYPE l_tbl_t IS TABLE OF tablename.%ROWTYPE;

l_tbl_data l_tbl_t ;

OPEN cur_tbl FOR 'SELECT * FROM :s ' USING b.table_name;

FETCH cur_tbl BULK COLLECT INTO l_tbl_data LIMIT 5000;

EXIT WHEN cur_tbl%NOTFOUND;

CLOSE cur_tbl;

FORALL i IN 1 .. l_tbl_data .count

EXECUTE IMMEDIATE 'insert into '||l_tbl_nm||' values (:1)' USING

l_tbl_data(i);

希望你能帮助我,并建议我如何使这段代码更简单 . 非常感谢 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值