主要是您需要生成table1 的ID 值以插入table2。为此,您可以在创建包含一些约束的表后使用 INSERT ... RETURNING ID INTO v_id 语句,尤其是独特的约束,例如 PRIMARY KEY 和 UNIQUE
CREATE TABLE table1( ID INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, letter VARCHAR2(1) NOT NULL );
ALTER TABLE table1 ADD CONSTRAINT uk_tab1_letter UNIQUE(letter);
CREATE TABLE table2( ID INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, table1_id INT, value INT );
ALTER TABLE table2 ADD CONSTRAINT fk_tab2_tab1_id FOREIGN KEY(table1_id) REFERENCES table1 (ID);
并添加异常处理,以免在第一个表中插入重复的字母。然后使用下面的代码块;
DECLARE
v_id table1.id%TYPE;
v_letter table1.letter%TYPE := 'A';
v_value table2.value%TYPE := 1;
BEGIN
BEGIN
INSERT INTO table1(letter) VALUES(v_letter) RETURNING ID INTO v_id;
EXCEPTION WHEN OTHERS THEN NULL;
END;
INSERT INTO table2(table1_id,value) SELECT id,v_value FROM table1 WHERE letter = v_letter;
COMMIT;
END;
/
并通过将v_letter&v_value 的初始化值分别更改为'A'&2、'B'&1、'B'&2 ..等来运行。
或者,您可以将代码块转换为存储过程或函数,例如
CREATE OR REPLACE PROCEDURE Pr_Ins_Tabs(
v_letter table1.letter%TYPE,
v_value table2.value%TYPE
) AS
v_id table1.id%TYPE;
BEGIN
BEGIN
INSERT INTO table1(letter) VALUES(v_letter) RETURNING ID INTO v_id;
EXCEPTION WHEN OTHERS THEN NULL;
END;
INSERT INTO table2(table1_id,value) SELECT id,v_value FROM table1 WHERE letter = v_letter;
COMMIT;
END;
/
为了有弹性地撤销如
BEGIN
Pr_Ins_Tabs('A',2);
END;
/
Demo
附言。 如果您的数据库版本早于 12c,则创建序列(seq1&seq2)并在插入语句中使用seq1.nextval&seq2.nextval,因为在表创建中无法使用GENERATED ALWAYS AS IDENTITY 子句DDL 语句。