在Oracle 11g中将数据从登台表加载到主表

时间:2018-10-05 15:16:21

标签: oracle

到目前为止,在 oracle 中从暂存表向主表加载数据的最有效方法是什么。

假设我的桌子如下

TABLE Persons
(
Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
HouseNumber int,
)

下面是我的登台表

TABLE Persons_Staging
(
Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
HouseNumber varchar(255),
)

我想要实现的是,每天都要将登台表中的新数据进行一些处理后放入主表中。。

例如,在将数据加载到名字/姓氏列之前,应以某种方式对数据进行大写/小写转换。或者可以更改“日期”列中的日期格式。 (数据加载到主表之前的一些基本转换)。

我应该使用此程序,还是可以使用其他工具?

2 个答案:

答案 0 :(得分:1)

我认为解决此类任务的最佳方法是触发。

您可以为Persons_Staging创建触发器,就像这样:

Create Or Replace Trigger Persons_Staging_Before_Insert
  Before Insert On Persons_Staging
  For Each Row

Declare
Begin
  Insert Into Persons
    (Id, Lastname, Firstname, Housenumber)
  Values
    (:New.Id,
     Upper(:New.Lastname),
     Upper(:New.Firstname),
     :New.Housenumber);
End;

希望对您有帮助

答案 1 :(得分:1)

我认为,纯SQL INSERT是正确的方法,即

insert into persons 
  (id, lastname, firstname, housenumber)
select id, lastname, firstname, housenumber 
from persons_staging;

如果您要进行某些处理,请在数据驻留在登台表中时进行,除非您可以将这些转换包括在上述INSERT语句中(例如initcap或您提到的upper

如果您打算使用某种PL / SQL,则遍历所有临时表行,对每一行进行处理,然后将其移至目标表-可能会非常慢。逐行处理速度很慢。

如果可能的话,请按照可能影响整个数据集的方式进行操作,而不是逐个进行。

此外,尝试避免上下文切换(编写调用PL / SQL并重复多次的SQL)。如果您有使用SQL语句的PL / SQL过程,那么没问题-很好。