对于作业,我有类似于以下的内容(为简洁而简化):
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);
但我想知道输入这些数据的真正方法是什么,它是一个带循环的程序吗?如果是这样的循环(以便它可以处理任何数量的单位)。
提前致谢
答案 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)
你需要的是一个接受的程序:
程序将:
循环遍历数组并将数组的每个元素和名字和姓氏的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