簡體   English   中英

Oracle SQL插入查詢-進入父表和子表

[英]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,也許您已經在這樣做了),
  • 遍歷數組,然后將數組的每個元素以及“姓氏”和“姓氏”的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM