【发布时间】:2015-01-25 05:54:21
【问题描述】:
我有一个由程序代码填充的数据暂存表。
TABLE BatchRecord{
BatchRecordID NUMBER PRIMARY KEY,
BatchID NUMBER, --Assigned by the procedural code
RecordID NUMBER, --Relative to the batch
FieldID NUMBER, --Assigned by the procedural code; FK to another table
Value VARCHAR2(MAX)
Instance NUMBER}
每个 BatchRecord 然后需要转换成三个相关的表:Records、RecordFields、FieldValues。
TABLE Record{
RecordID NUMBER PRIMARY KEY,
BatchID NUMBER, --Same from BatchRecords}
TABLE RecordFields{
RecordFieldID NUMBER PRIMARY KEY,
RecordID NUMBER, --FK from Records
FieldID NUNBER --Same from BatchRecords}
TABLE FieldValues{
RecordFieldID NUMBER PRIMARY KEY,
Instance NUMBER PRIMARY KEY, --Same from BatchRecords
Value VARCHAR2(MAX) --Same from BatchRecords}
在 SQL Server 中,我可以使用 MERGE 语句并使用 OUTPUT 捕获新插入的键来完成此操作:
CREATE TABLE #InsertedRecords(RecordID INT, NewRecordID INT);
MERGE INTO Records USING (
SELECT RecordID
FROM BatchRecords
WHERE BatchID = @BatchID
GROUP BY RecordID) AS BR ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (BatchID)
VALUES (@BatchID)
OUTPUT BR.RecordID, INSERTED.RecordID INTO #InsertedRecords;
RecordFields的插入也采用类似的方法,FieldValues中使用INSERT...SELECT语句插入。
但是,在 Oracle 中,不能在 MERGE 语句甚至 SELECT...INTO 语句中使用 RETURNING(相当于 OUTPUT)。
是否有一种方法可以在 Oracle 中完成相同的任务,同时避免 FORALL 循环,因为 BatchRecord 的总数可能超过几百万?
【问题讨论】:
标签: oracle bulkinsert oracle12c sql-returning