2

对于一项任务,我有类似以下的内容(为简洁起见):

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

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

提前致谢

4

3 回答 3

1

最好的方法之一是使用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');
于 2013-10-19T07:54:05.900 回答
0

您可以在插入中使用 select:

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

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

于 2013-10-19T07:34:27.350 回答
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 过程的更多信息: 将数据数组作为输入参数传递给 Oracle 过程

于 2013-10-19T08:09:52.590 回答