2016-12-04 59 views
1

背景如何创建与表中记录相同类型的集合?

我试图创建从审计清单 表定期将数据移动到另一个数据库的过程。

为了避免产生大量的撤消,我想在 时间做1000条记录。为此,我将批量收集数据到每个审计表的 集合中,限制为1000条记录,时间为 ,将数据插入远程表,然后删除 在全部数据中取回1000条记录。

我也会做其他各种任务(采伐数据迁移 为每个表并发送通知。

因为,审计表的数量是相当大的,我不想 创建过程每个表。所以,我需要能够 动态创建的集合,是相同的结构作为 表。


问题

如何在 PL/SQL过程中的表中创建与记录相同类型的集合?

注意:集合只需要为结构相同的表在那个瞬间,当代码运行。我不认为收集到 动态变化 - 我知道这是不可能的。只有在该过程运行的时候,它才需要使用与表格相同的结构创建,以便我可以将其用于复制操作。


我已经尝试过

我试图尝试从数据 字典创建一个动态的SQL语句。我意识到我可以为常见类型做到这一点,我是 能够处理精度,varchar2字节与字符等。但我认为它 可能会失败的一些其他数据类型/精度组合。

+1

'我如何创建同一类型的集合作为记录'通过?使用'%rowtype'属性。所以它可能是这样的'type t_col是your_table_name%rowtype的表格;' –

+0

'但我认为它可能会失败的一些其他数据类型/精度组合。 – GurV

+0

@NicholasKrasnov如果我们事先不知道类型该怎么办?我认为这就是这个意思。 – GurV

回答

2

问题

如何创建同一类型的集合作为表 一个PL/SQL程序内的记录?

你可能需要%ROWTYPE声明,请看看很简单的例子:

CREATE TABLE abc111(
    x int, 
    y varchar2(100) 
); 

CREATE TABLE abc222 AS SELECT * FROM abc111; 

INSERT INTO abc111 
SELECT level , rpad(level, 10 ,level) 
FROM dual 
CONNECT BY LEVEL <= 10; 



DECLARE 
    -- ====> here %ROWTYPE declaration is used <======== 
    TYPE type_name IS TABLE OF abc111%ROWTYPE; 
    rec_var type_name; 
BEGIN 
    SELECT * BULK COLLECT INTO rec_var 
    FROM abc111; 
    FORALL indx IN 1 .. rec_var.COUNT 
    INSERT INTO abc222 VALUES rec_var(indx) ; 
END; 
/

SELECT * FROM abc222; 

     X Y                         
---------- -------------- 
     1 1111111111                       
     2 2222222222                       
     3 3333333333                       
     4 4444444444                       
     5 5555555555                       
     6 6666666666                       
     7 7777777777                       
     8 8888888888                       
     9 9999999999                       
     10 1010101010                       

10 rows selected 
+0

这个问题表明,有大量的表,并为每个单独做这件事相当耗时。没有办法在运行时定义rowtype,即表类型是不是预先定义的? – GurV

+0

那部分没关系。我只需要“问题”部分中的信息。为了更清楚地了解我的意图,我提供了“背景”部分,以便人们能够提出比我想要的更好的解决方案。 – Zesty

+0

@Gurwinder Singh - 这可以使用动态SQL轻松完成 - 只需使用EXECUTE IMMEDIATE从循环中的答案中运行代码,然后动态替换其中的表名即可。 – krokodilko

相关问题