【问题标题】:Insert into another table after manipulations操作后插入另一个表
【发布时间】:2015-10-05 03:28:26
【问题描述】:

我在两个不同的数据库中有两个结构相同的表。

现在,我想将一个表(例如 db1 的 table1)中的内容复制到另一个表(例如 db2 的 table2),但我想在插入之前对某些列执行某些操作。

例如,如果 db1 的 table1 有 50 列,我想操作一些(比如 5 个)列并按原样插入其余列

以下是我所做的。

我正在编写一个 pl/sql 脚本,声明与表列一样多的变量
然后是从表中选择的光标
然后在循环中迭代以对各个列执行操作并插入到 table2 中

DECLARE
var1   datatype;
var2   datatype;
..

CURSOR MY_CUR is
SELECT * FROM table1;

BEGIN
FOR CUR_ROW in MY_CUR
LOOP
    var1 := CUR_ROW.column1
    var2 := CUR_ROW.column2
    ..
    logic to modify some variables e.g. var1 := LPAD(var1,5,'1');
    ..
insert into table2@db2
(column1, column2 ..)
values
(var1, var2 ..);
END LOOP;
END;

这很慢,有没有其他有效的方法来完成这个?
(可能是 BULK COLLECT 或 FORALL?)但是使用 BULK COLLECT 或 FORALL,我如何对单个列执行操作?

我正在使用 Oracle10g

【问题讨论】:

  • 单条SQL语句不能使用有没有原因(insert into t2@db2( col1, col2, ... ) select lpad(col1,5,'1'), ... from t1)?
  • 这取决于你想做什么操作。其中一些,如 LPAD,可以使用 SQL 函数来完成。您可以在光标定义中说选择 lpad(var1)。有些可能需要程序逻辑。
  • 是的,因为我必须进行多次操作,这需要检查 IF ELSIF 中的变量并涉及在变量上实现的其他循环。 LPAD 只是一个例子来说明我想对变量进行某些操作。谢谢。
  • 流水线函数可能会更快,但我会首先寻找一种使用纯 SQL 的方法,或者第二个用于带有嵌入式 PL/SQL 函数的 SQL,而不是逐行方法。

标签: oracle plsql


【解决方案1】:

尝试再做一件事,使用您正在执行的 for 循环构建集合,然后使用批量插入语句将其插入。首先声明用于插入的行类型表的集合。例如。

   type table2_typ is table of  table2@db2%rowtype
   v_table2_typ  table2_typ; 

在你的基本 for 循环中填充集合 v_table2_typ,然后使用批量收集插入插入它,例如。

FORALL i IN 1..v_table2_typ.COUNT
 INSERT INTO t1 VALUES v_table2_typ(i);

如果你的数据量比较大,需要使用limit子句和commit机制。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 2021-08-16
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多