到目前为止,在 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),
)
我想要实现的是,每天都要将登台表中的新数据进行一些处理后放入主表中。。
例如,在将数据加载到名字/姓氏列之前,应以某种方式对数据进行大写/小写转换。或者可以更改“日期”列中的日期格式。 (数据加载到主表之前的一些基本转换)。
我应该使用此程序,还是可以使用其他工具?
答案 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过程,那么没问题-很好。