Oracle SQL插入查询 - 进入父表和子表

时间:2013-10-19 06:46:23

标签: sql oracle insert

对于作业,我有类似于以下的内容(为简洁而简化):

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);

但我想知道输入这些数据的真正方法是什么,它是一个带循环的程序吗?如果是这样的循环(以便它可以处理任何数量的单位)。

提前致谢

3 个答案:

答案 0 :(得分:0)

您可以在插入中使用select:

INSERT INTO STUDENT_UNIT select t1.StudentID ,t2.UnitID from STUDENT t1 ,UNIT t2;

您可以使用where来限制此选择; - )

答案 1 :(得分:0)

执行此操作的最佳方法之一是使用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;     
/

您可以将divid以逗号分隔,如下所示,

EXECUTE set_stud_unit('Bob', 'Brown', '111,222,333');

答案 2 :(得分:0)

你需要的是一个接受的程序:

  • 名字
  • 姓氏
  • 单位数组

程序将:

  • 插入STUDENT(我建议你使用触发器来填充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;
    

我建议您查询student表以获取实际ID,以避免出现并发问题。优化是仅查询一次STUDENT表并将StudentID保存在变量中。

您可以在此处找到有关将数组传递给Oracle过程的更多信息: Passing an array of data as an input parameter to an Oracle procedure