【问题标题】:How can I create a collection of the same type as a record in a table?如何创建与表中记录相同类型的集合?
【发布时间】:2016-12-04 20:52:49
【问题描述】:

背景

我正在尝试创建一个从审核列表中移动数据的程序 定期将表转移到不同的数据库。

为了避免产生大量撤消,我想一次执行这 1000 条记录 时间。出于这个原因,我会将数据批量收集到一个 收集每个审计表,每次限制为 1000 条记录 时间,将数据插入远程表,然后删除 在 forall 中获取了 1000 条记录。

我还将执行其他各种任务(记录数据迁移 为每个表和发送通知。

由于审计表的数量很大,我不想 为每个表创建一个过程。所以,我需要能够 动态创建一个与 表。


问题

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

注意:集合只需要与表在代码运行的那一刻具有相同的结构。我不希望收藏 动态变化 - 我知道这是不可能的。只有在程序运行的那一刻,它才需要创建与表相同的结构,以便我可以将其用于复制操作。


我已经尝试过的

我尝试从数据中创建动态 SQL 语句 字典。我意识到我可以为常见类型做到这一点,而且我 能够处理精度,varchar2 byte vs char等。但我认为 对于某些其他数据类型/精度组合可能会失败。

【问题讨论】:

  • How can I create a collection of the same type as a record? 通过使用%rowtype 属性。所以它可能是这样的type t_col is table of your_table_name%rowtype;
  • But I think it might fail for some other data types/precisions combinations. - 比如?
  • @NicholasKrasnov 如果我们事先不知道类型怎么办?我想这就是它的意义所在。
  • @NicholasKrasnov 啊, %rowtype 是我需要的。谢谢!
  • @GurwinderSingh 我试图通过查询数据字典来动态创建集合,因为我不知道 %rowtype 属性。

标签: oracle plsql


【解决方案1】:

问题

如何创建与表中记录相同类型的集合 在 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 

【讨论】:

  • 问题表明有大量的表,分别为每个表执行此操作非常耗时。难道没有办法在运行时定义行类型,即表类型不是事先定义的吗?
  • 那部分没问题。我只需要“问题”部分中的信息。为了更清楚地了解我的意图,我提供了“背景”部分,以便人们可以提出比我尝试的更好的解决方案。
  • @Gurwinder Singh - 这可以使用动态 SQL 轻松完成 - 只需使用 EXECUTE IMMEDIATE 运行从循环中的答案中截取的代码,并动态替换其中的表名。
  • @krokodilko 是这样吗?真的没试过。我就试试看。谢谢
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多