【发布时间】: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,而不是逐行方法。