[英]Oracle SQL insert query - into parent and child tables
對於一項作業,我有類似以下內容的內容(為簡潔起見簡化):
STUDENT(StudentID, Fname. Lname) StudentID PK
UNIT(UnitID, UnitName) UnitID PK
STUDENT_UNIT((StudentID, UnitID) StudentID PK/FK UnitID PK/FK
需要插入有關學生及其完成的單元的信息。 由於它只是初學者級SQL,因此接受了以下內容
INSERT INTO STUDENT
VALUES(seqStudID.NextVal, 'Bob', 'Brown');
INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 111);
INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 222);
INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 333);
但是我想知道輸入數據的真正方法是什么,這是一個帶有循環的過程嗎? 如果是這樣,則進行什么樣的循環(以便它可以處理任何數量的單元)。
提前致謝
您可以在插入內容中使用select:
INSERT INTO STUDENT_UNIT select t1.StudentID ,t2.UnitID from STUDENT t1 ,UNIT t2;
您可以在哪里限制此選擇;-)
最好的方法之一是使用stored procedure
。 以下過程將為您做所有事情。
CREATE OR REPLACE
PROCEDURE set_stud_unit(
i_fname IN VARCHAR2,
i_lname IN VARCHAR2,
i_unitid IN VARCHAR2)
IS
l_studentid student.studentid%TYPE;
BEGIN
INSERT INTO student(studentid, fname, lname)
VALUES(seqstudid.NEXTVAL, i_fname, i_lname)
RETURNING studentid INTO l_studentid;
INSERT INTO student_unit (studentid, unitid)
(SELECT l_studentid, (COLUMN_VALUE).getNumberVal() vid FROM xmltable(i_unitid));
COMMIT;
END;
/
您可以將unitid傳遞為逗號,如下所示,
EXECUTE set_stud_unit('Bob', 'Brown', '111,222,333');
您可能需要的是一個接受以下程序的程序:
該過程將:
遍歷數組,然后將數組的每個元素以及“姓氏”和“姓氏”的StudentID插入到STUDENT_UNIT中,但不使用序列。 我的偽代碼:
FOR i IN 1..input_array.count LOOP INSERT INTO STUDENT_UNIT SELECT StudentID, input_array(i) FROM STUDENT WHERE Fname = FirstNameParam AND Lname = LastNameParam; END LOOP;
建議您查詢學生表以獲取實際的ID,以避免在並發情況下出現問題。 一種優化是只查詢一次STUDENT表,然后將StudentID保存在變量中。
您可以在此處找到有關將數組傳遞給Oracle過程的更多信息: 將數據數組作為輸入參數傳遞給Oracle過程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.