我遇到了一个棘手的情况。我需要创建一个通用的插入脚本,将数据从较低的envt移动到较高的envt(用于测试目的(。我有三个表tab1
、tab2
和tab3
,每个表都有序列列(tab1_col_ID
、tab2_col_id
和tab3_col_id
(,其中它包含oracle中的序列号,并且共享相同的序列id(比如SID
(。
以下是示例:
tab1
tab1_col_id
11
12
tab2
tab2_col_id
21
22
tab3
tab1_col_id,tab1_col_id,tab2_col_id
31,11,21
32,12,22
在tab3
中,tab1_col_id
和tab2_col_id
是tab1
(tab1_col_id
(和tab2
(tab2_col_id
(表的外键。tab1_col_id
、tab2_col_id
和tab3_col_id
是通过相同序列生成的数字(SID
(。因此,这里tab3
应该包含tab1
和tab2
序列号。
那么,有没有一种方法可以将其作为一个通用的插入脚本,一旦运行,我将生成INSERT INTO
stmts。
您可以生成一个使用RETURNING INTO
子句的脚本,并在UAT环境中逐行插入。生成的脚本看起来像这样(对于单行(:
DECLARE
l_tab1_col_id NUMBER;
l_tab2_col_id NUMBER;
BEGIN
INSERT INTO tab1 (col1) VALUES ('x') RETURNING tab1_col_id INTO l_tab1_col_id;
INSERT INTO tab2 (col1) VALUES ('xy') RETURNING tab2_col_id INTO l_tab2_col_id;
INSERT INTO tab3 (tab1_col_id,tab2_col_id,col1) VALUES (l_tab1_col_id,l_tab2_col_id,'xyz');
END;
/
这将重新生成主键和外键并保持关系。但这是一个缓慢而乏味的操作。如果这是一个选项,那么我会生成带有偏移量的insert语句,以便生成的id高于UAT环境中的nextval,运行insert,然后更改序列。
假设UAT环境中序列的最高值为100,根据以下选择生成插入语句:
SELECT tab1_col_id + 100, col1 FROM tab1;
SELECT tab2_col_id + 100, col1 FROM tab2;
SELECT tab3_col_id + 100, tab1_col_id + 100, tab2_col_id + 100, col1 FROM tab1;
UAT上的insert语句运行后,将序列更改为START WITH
,即tab1_col_id或tab1_col_id或tab1_coll_id的最高值。