具有序列号的多个表的通用插入stmt



我遇到了一个棘手的情况。我需要创建一个通用的插入脚本,将数据从较低的envt移动到较高的envt(用于测试目的(。我有三个表tab1tab2tab3,每个表都有序列列(tab1_col_IDtab2_col_idtab3_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_idtab2_col_idtab1(tab1_col_id(和tab2(tab2_col_id(表的外键。tab1_col_idtab2_col_idtab3_col_id是通过相同序列生成的数字(SID(。因此,这里tab3应该包含tab1tab2序列号。

那么,有没有一种方法可以将其作为一个通用的插入脚本,一旦运行,我将生成INSERT INTOstmts。

您可以生成一个使用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的最高值。

最新更新